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
@@ -10,6 +10,7 @@ import typing as ta
10
10
 
11
11
  from .... import check
12
12
  from .... import lang
13
+ from ....logs import all as logs
13
14
  from ..processing.base import ProcessingContext
14
15
  from ..processing.base import ProcessingOption
15
16
  from ..processing.base import Processor
@@ -21,7 +22,6 @@ from .execution import OpExecutor
21
22
  from .globals import FN_GLOBALS
22
23
  from .globals import FnGlobal
23
24
  from .idents import CLS_IDENT
24
- from .mangling import IDENT_MANGLER
25
25
  from .ops import Op
26
26
  from .ops import OpRef
27
27
  from .ops import OpRefMap
@@ -30,6 +30,9 @@ from .registry import all_generator_types
30
30
  from .registry import generator_type_for_plan_type
31
31
 
32
32
 
33
+ log = logs.get_module_logger(globals())
34
+
35
+
33
36
  ##
34
37
 
35
38
 
@@ -38,9 +41,10 @@ class PlanOnly(ProcessingOption):
38
41
  b: bool
39
42
 
40
43
 
41
- @dc.dataclass(frozen=True)
42
- class Verbose(ProcessingOption):
43
- b: bool
44
+ @dc.dataclass(frozen=True, kw_only=True)
45
+ class Verbosity(ProcessingOption):
46
+ warn: bool = False
47
+ debug: bool = False
44
48
 
45
49
 
46
50
  class CompileCallback(ta.Protocol):
@@ -53,13 +57,21 @@ class CompileCallback(ta.Protocol):
53
57
  ...
54
58
 
55
59
 
56
- @dc.dataclass(frozen=True)
60
+ @dc.dataclass(frozen=True, kw_only=True)
57
61
  class Codegen(ProcessingOption):
58
- callback: CompileCallback
62
+ style: ta.Literal['jit', 'aot'] = 'jit'
63
+
64
+ force: bool = False
65
+ callback: CompileCallback | None = None
66
+
67
+
68
+ ##
59
69
 
60
70
 
61
71
  @register_processor_type(priority=ProcessorPriority.GENERATION)
62
72
  class GeneratorProcessor(Processor):
73
+ PROCESS_FN_NAME: ta.ClassVar[str] = '_process_dataclass'
74
+
63
75
  class Mode(lang.Abstract):
64
76
  @abc.abstractmethod
65
77
  def _process(self, gp: 'GeneratorProcessor', cls: type) -> None:
@@ -85,36 +97,52 @@ class GeneratorProcessor(Processor):
85
97
 
86
98
  self._codegen = codegen
87
99
 
100
+ @classmethod
101
+ def build_standard_kwargs(cls, dc_cls: type) -> dict[str, ta.Any]:
102
+ kw: dict = {CLS_IDENT: dc_cls}
103
+ kw.update({
104
+ k.ident: v.value
105
+ for k, v in FN_GLOBALS.items()
106
+ })
107
+ return kw
108
+
88
109
  def _process(self, gp: 'GeneratorProcessor', cls: type) -> None:
89
- compiler = OpCompiler(
90
- OpCompiler.AotStyle(),
91
- # OpCompiler.JitStyle(),
92
- )
110
+ style: OpCompiler.Style = {
111
+ 'jit': OpCompiler.JitStyle,
112
+ 'aot': OpCompiler.AotStyle,
113
+ }[self._codegen.style]()
93
114
 
94
- fn_name = '_process_dataclass__' + IDENT_MANGLER.mangle(cls.__qualname__)
115
+ compiler = OpCompiler(style)
95
116
 
96
117
  comp = compiler.compile(
97
- fn_name,
118
+ GeneratorProcessor.PROCESS_FN_NAME,
98
119
  gp.ops(),
99
120
  )
100
121
 
101
- if (vo := gp._ctx.option(Verbose)) is not None and vo.b: # noqa
122
+ comp_src = '\n'.join([
123
+ *comp.hdr_lines,
124
+ *(['', ''] if comp.hdr_lines else []),
125
+ *comp.fn_lines,
126
+ ])
127
+
128
+ if (vo := gp._ctx.option(Verbosity)) is not None and vo.debug: # noqa
102
129
  print(gp.prepare().plans.render(), file=sys.stderr)
103
130
  print(file=sys.stderr)
104
- print(comp.src, file=sys.stderr)
131
+ print(comp_src, file=sys.stderr)
105
132
  print(file=sys.stderr)
106
133
 
107
134
  ns: dict = {}
108
135
  ns.update(compiler.style.globals_ns()) # noqa
109
136
 
110
- exec(comp.src, ns)
111
- o_fn = ns[comp.fn_name]
137
+ exec(comp_src, ns)
138
+ o_fn = ns[GeneratorProcessor.PROCESS_FN_NAME]
112
139
 
113
140
  if cls.__module__ in sys.modules:
114
141
  gl = sys.modules[cls.__module__].__dict__
115
142
  else:
116
143
  gl = {}
117
144
 
145
+ # TODO: comment why lol
118
146
  fn = lang.new_function(**{
119
147
  **lang.new_function_kwargs(o_fn),
120
148
  **dict(
@@ -122,12 +150,8 @@ class GeneratorProcessor(Processor):
122
150
  ),
123
151
  })
124
152
 
125
- kw: dict = {CLS_IDENT: cls}
126
- kw.update({
127
- k.ident: v.value
128
- for k, v in FN_GLOBALS.items()
129
- # if v.src.startswith('.')
130
- })
153
+ kw = self.build_standard_kwargs(cls)
154
+
131
155
  orm = gp.prepare().ref_map
132
156
  for r in comp.refs:
133
157
  if isinstance(r, OpRef):
@@ -140,7 +164,7 @@ class GeneratorProcessor(Processor):
140
164
  fn(**kw)
141
165
 
142
166
  if (cg := self._codegen) is not None and (cb := cg.callback) is not None:
143
- cb(
167
+ cb( # noqa
144
168
  gp._ctx, # noqa
145
169
  gp.prepare(),
146
170
  comp,
@@ -194,13 +218,70 @@ class GeneratorProcessor(Processor):
194
218
 
195
219
  #
196
220
 
221
+ def _process_from_codegen(self, cls: type) -> bool:
222
+ cg_pkg = check.not_none(self._ctx.pkg_cfg.pkg)
223
+ cg_mod_spec = f'{cg_pkg}._dataclasses'
224
+
225
+ try:
226
+ __import__(cg_mod_spec)
227
+ except ImportError:
228
+ if (vo := self._ctx.option(Verbosity)) is not None and vo.warn: # noqa
229
+ log.warning(lambda: f'Codegen module missing for {cls.__module__}.{cls.__qualname__} at {cg_mod_spec}')
230
+ return False
231
+
232
+ cg_mod = sys.modules[cg_mod_spec]
233
+ cg_fn_reg = cg_mod.REGISTRY
234
+
235
+ #
236
+
237
+ prep = self.prepare()
238
+ prep_plan_repr = repr(prep.plans)
239
+
240
+ #
241
+
242
+ try:
243
+ cg_reg_item = cg_fn_reg[prep_plan_repr]
244
+ except KeyError:
245
+ if (vo := self._ctx.option(Verbosity)) is not None and vo.warn: # noqa
246
+ log.warning(lambda: f'Codegen missing for {cls.__module__}.{cls.__qualname__} in {cg_mod_spec}')
247
+ return False
248
+
249
+ cg_kw, cg_fn = cg_reg_item
250
+
251
+ #
252
+
253
+ ref_map = {
254
+ ref.ident(): v
255
+ for ref, v in prep.ref_map.items()
256
+ }
257
+
258
+ #
259
+
260
+ fn_kw = {
261
+ **GeneratorProcessor.CompilerMode.build_standard_kwargs(cls),
262
+ **{k: ref_map[k] for k in cg_kw['op_ref_idents']},
263
+ }
264
+
265
+ fn = cg_fn()
266
+ fn(**fn_kw)
267
+
268
+ return True
269
+
270
+ #
271
+
197
272
  def process(self, cls: type) -> type:
198
273
  if (po := self._ctx.option(PlanOnly)) is not None and po.b:
199
274
  self.prepare()
200
275
  return cls
201
276
 
277
+ cg = self._ctx.option(Codegen)
278
+
279
+ if not (cg is not None and cg.force) and self._ctx.pkg_cfg.cfg.codegen:
280
+ if self._process_from_codegen(cls):
281
+ return cls
282
+
202
283
  mode: GeneratorProcessor.Mode
203
- if (cg := self._ctx.option(Codegen)) is not None: # noqa
284
+ if cg is not None: # noqa
204
285
  mode = GeneratorProcessor.CompilerMode(codegen=cg)
205
286
  else:
206
287
  mode = GeneratorProcessor.ExecutorMode()
@@ -10,6 +10,8 @@ import typing as ta
10
10
  from .... import check
11
11
  from .... import lang
12
12
  from ...specs import ClassSpec
13
+ from ..configs import DEFAULT_NAMED_PACKAGE_CONFIG
14
+ from ..configs import NamedPackageConfig
13
15
 
14
16
 
15
17
  T = ta.TypeVar('T')
@@ -33,6 +35,7 @@ class ProcessingContext:
33
35
  cs: ClassSpec,
34
36
  item_factories: ta.Mapping[type, ProcessingContextItemFactory],
35
37
  *,
38
+ pkg_cfg: NamedPackageConfig = DEFAULT_NAMED_PACKAGE_CONFIG,
36
39
  options: ta.Sequence[ProcessingOption] | None = None,
37
40
  ) -> None:
38
41
  super().__init__()
@@ -40,6 +43,7 @@ class ProcessingContext:
40
43
  self._cls = cls
41
44
  self._cs = cs
42
45
  self._item_factories = item_factories
46
+ self._pkg_cfg = pkg_cfg
43
47
 
44
48
  options_dct: dict = {}
45
49
  for o in options or ():
@@ -57,6 +61,10 @@ class ProcessingContext:
57
61
  def cs(self) -> ClassSpec:
58
62
  return self._cs
59
63
 
64
+ @property
65
+ def pkg_cfg(self) -> NamedPackageConfig:
66
+ return self._pkg_cfg
67
+
60
68
  def __getitem__(self, ty: type[T]) -> T:
61
69
  try:
62
70
  return self._items[ty]
@@ -5,7 +5,7 @@ import typing as ta
5
5
  from .... import lang
6
6
  from ...specs import ClassSpec
7
7
  from .. import concerns as _concerns # noqa # imported for registration
8
- from ..configs import DEFAULT_PACKAGE_CONFIG
8
+ from ..configs import DEFAULT_NAMED_PACKAGE_CONFIG
9
9
  from ..configs import PACKAGE_CONFIG_CACHE
10
10
  from ..generation import processor as gp
11
11
  from .base import ProcessingContext
@@ -41,21 +41,20 @@ def drive_cls_processing(
41
41
  cs: ClassSpec,
42
42
  *,
43
43
  plan_only: bool = False,
44
- verbose: bool = False,
44
+ warn: bool = False,
45
+ debug: bool = False,
45
46
  ) -> type:
46
47
  options: list[ProcessingOption] = list(_OPTIONS_CONTEXT_VAR.get())
47
48
  if plan_only:
48
49
  options.append(gp.PlanOnly(True))
49
- if verbose:
50
- options.append(gp.Verbose(True))
50
+ if warn or debug:
51
+ options.append(gp.Verbosity(warn=warn, debug=debug))
51
52
 
52
53
  #
53
54
 
54
- pkg_config = DEFAULT_PACKAGE_CONFIG
55
55
  cls_mod = cls.__module__
56
- if '.' in cls_mod:
57
- cls_pkg = cls_mod.rpartition('.')[0]
58
- pkg_cfg = PACKAGE_CONFIG_CACHE.get(cls_pkg, pkg_config) # noqa
56
+ cls_pkg = cls_mod.rpartition('.')[0]
57
+ pkg_cfg = lang.coalesce(PACKAGE_CONFIG_CACHE.get(cls_pkg), DEFAULT_NAMED_PACKAGE_CONFIG)
59
58
 
60
59
  #
61
60
 
@@ -63,6 +62,7 @@ def drive_cls_processing(
63
62
  cls,
64
63
  cs,
65
64
  all_processing_context_item_factories(),
65
+ pkg_cfg=pkg_cfg,
66
66
  options=options,
67
67
  )
68
68
 
@@ -1,6 +1,7 @@
1
1
  """Should be kept pure. No references to dc std, no references to impl detail."""
2
2
  import dataclasses as dc
3
3
  import enum
4
+ import types
4
5
  import typing as ta
5
6
 
6
7
  from .. import check
@@ -28,6 +29,30 @@ class DefaultFactory(ta.NamedTuple):
28
29
  ##
29
30
 
30
31
 
32
+ class _SpecBase:
33
+ _BOOL_FIELDS: ta.ClassVar[ta.Sequence[dc.Field]]
34
+ _OPT_BOOL_FIELDS: ta.ClassVar[ta.Sequence[dc.Field]]
35
+
36
+ def _check_spec_base_fields(self) -> None:
37
+ for f in self._BOOL_FIELDS:
38
+ if not isinstance(bv := getattr(self, f.name), bool):
39
+ raise TypeError(f'dataclass {self.__class__.__name__} attr {f.name} must be bool, got {bv!r}')
40
+
41
+ for f in self._OPT_BOOL_FIELDS:
42
+ if not isinstance(bv := getattr(self, f.name), (bool, types.NoneType)):
43
+ raise TypeError(f'dataclass {self.__class__.__name__} attr {f.name} must be bool or None, got {bv!r}')
44
+
45
+
46
+ def _init_spec_base(cls):
47
+ cls._BOOL_FIELDS = [f for f in dc.fields(cls) if f.type is bool] # noqa
48
+ cls._OPT_BOOL_FIELDS = [f for f in dc.fields(cls) if f.type in (bool | None, ta.Optional[bool])] # noqa
49
+
50
+ return cls
51
+
52
+
53
+ ##
54
+
55
+
31
56
  class FieldType(enum.StrEnum):
32
57
  INSTANCE = enum.auto()
33
58
  CLASS_VAR = enum.auto()
@@ -36,8 +61,9 @@ class FieldType(enum.StrEnum):
36
61
  __repr__ = lang.enum_name_repr
37
62
 
38
63
 
64
+ @_init_spec_base
39
65
  @dc.dataclass(frozen=True, kw_only=True, eq=False)
40
- class FieldSpec(lang.Final):
66
+ class FieldSpec(_SpecBase, lang.Final):
41
67
  name: str
42
68
  annotation: ta.Any
43
69
 
@@ -95,6 +121,8 @@ class FieldSpec(lang.Final):
95
121
  check.non_empty_str(self.name)
96
122
  check.arg(self.name.isidentifier())
97
123
 
124
+ self._check_spec_base_fields()
125
+
98
126
  if self.field_type in (FieldType.CLASS_VAR, FieldType.INIT_VAR):
99
127
  if isinstance(self.default.or_else(None), DefaultFactory):
100
128
  raise TypeError(f'field {self.name} cannot have a default factory')
@@ -121,8 +149,9 @@ class FieldSpec(lang.Final):
121
149
  ##
122
150
 
123
151
 
152
+ @_init_spec_base
124
153
  @dc.dataclass(frozen=True, kw_only=True, eq=False)
125
- class ClassSpec(lang.Final):
154
+ class ClassSpec(_SpecBase, lang.Final):
126
155
  ##
127
156
  # fields
128
157
 
@@ -187,6 +216,7 @@ class ClassSpec(lang.Final):
187
216
 
188
217
  repr_id: bool = False
189
218
  terse_repr: bool = False
219
+ default_repr_fn: ReprFn | None = None
190
220
 
191
221
  allow_redundant_decorator: bool = False
192
222
 
@@ -209,6 +239,8 @@ class ClassSpec(lang.Final):
209
239
  # validate
210
240
 
211
241
  def __post_init__(self) -> None:
242
+ self._check_spec_base_fields()
243
+
212
244
  fields_by_name: dict[str, FieldSpec] = {}
213
245
  for f in self.fields:
214
246
  check.not_in(f.name, fields_by_name)
@@ -1,6 +1,5 @@
1
1
  import copy
2
2
  import dataclasses as dc
3
- import typing as ta
4
3
 
5
4
  from .._internals import STD_ATOMIC_TYPES
6
5
  from .._internals import std_is_dataclass_instance
@@ -78,14 +77,3 @@ def _astuple_inner(obj, tuple_factory):
78
77
 
79
78
  else:
80
79
  return copy.deepcopy(obj)
81
-
82
-
83
- ##
84
-
85
-
86
- def shallow_astuple(o: ta.Any) -> tuple[ta.Any, ...]:
87
- return tuple(getattr(o, f.name) for f in dc.fields(o))
88
-
89
-
90
- def shallow_asdict(o: ta.Any) -> dict[str, ta.Any]:
91
- return {f.name: getattr(o, f.name) for f in dc.fields(o)}
@@ -3,6 +3,7 @@ import typing as ta
3
3
 
4
4
  from ... import check
5
5
  from ... import lang
6
+ from ...lite.dataclasses import is_immediate_dataclass
6
7
 
7
8
 
8
9
  if ta.TYPE_CHECKING:
@@ -40,6 +41,8 @@ def update_fields(
40
41
  def inner(cls):
41
42
  if issubclass(cls, meta.DataMeta):
42
43
  raise TypeError('update_fields() cannot be used on DataMeta subclasses')
44
+ if is_immediate_dataclass(cls):
45
+ raise TypeError('update_fields() cannot be used on already processed dataclasses')
43
46
 
44
47
  if fields is None:
45
48
  for a, v in list(cls.__dict__.items()):
@@ -51,6 +54,8 @@ def update_fields(
51
54
  try:
52
55
  v = cls.__dict__[a]
53
56
  except KeyError:
57
+ if hasattr(cls, a):
58
+ raise TypeError('update_fields() cannot be used on parent dataclass fields') from None
54
59
  v = dc.field()
55
60
  else:
56
61
  if not isinstance(v, dc.Field):
@@ -142,7 +142,7 @@ class Static(lang.Abstract):
142
142
  n_md[_ExtraFieldParamsMetadata] = {
143
143
  fs_f.name: getattr(x_fs, fs_f.name)
144
144
  for fs_f in dc.fields(FieldSpec) # noqa
145
- if fs_f not in dc.Field.__slots__ # type: ignore[attr-defined]
145
+ if fs_f not in dc.Field.__slots__
146
146
  and fs_f.name not in ('default', 'default_factory')
147
147
  }
148
148
  new_fld.metadata = n_md # type: ignore[assignment]
@@ -51,7 +51,7 @@ class _cached_nullary: # noqa
51
51
 
52
52
  return self._value
53
53
 
54
- def __get__(self, instance, owner): # noqa
54
+ def __get__(self, instance, owner=None): # noqa
55
55
  bound = instance.__dict__[self._fn.__name__] = self.__class__(self._fn.__get__(instance, owner))
56
56
  return bound
57
57
 
@@ -7,12 +7,12 @@ import dataclasses as dc
7
7
  import json
8
8
  import typing as ta
9
9
 
10
- from ..lite.check import check
11
- from ..lite.marshal import OBJ_MARSHALER_FIELD_KEY
12
- from ..lite.marshal import unmarshal_obj
13
- from ..subprocesses.run import SubprocessRun
14
- from ..subprocesses.run import SubprocessRunnable
15
- from ..subprocesses.run import SubprocessRunOutput
10
+ from ...lite.check import check
11
+ from ...lite.marshal import OBJ_MARSHALER_FIELD_KEY
12
+ from ...lite.marshal import unmarshal_obj
13
+ from ...subprocesses.run import SubprocessRun
14
+ from ...subprocesses.run import SubprocessRunnable
15
+ from ...subprocesses.run import SubprocessRunOutput
16
16
 
17
17
 
18
18
  ##
@@ -7,12 +7,12 @@ import dataclasses as dc
7
7
  import enum
8
8
  import typing as ta
9
9
 
10
- from ..lite.check import check
11
- from ..lite.dataclasses import dataclass_repr_omit_falsey
12
- from ..lite.marshal import OBJ_MARSHALER_OMIT_IF_NONE
13
- from ..subprocesses.run import SubprocessRun
14
- from ..subprocesses.run import SubprocessRunnable
15
- from ..subprocesses.run import SubprocessRunOutput
10
+ from ...lite.check import check
11
+ from ...lite.dataclasses import dataclass_repr_omit_falsey
12
+ from ...lite.marshal import OBJ_MARSHALER_OMIT_IF_NONE
13
+ from ...subprocesses.run import SubprocessRun
14
+ from ...subprocesses.run import SubprocessRunnable
15
+ from ...subprocesses.run import SubprocessRunOutput
16
16
 
17
17
 
18
18
  ##
@@ -4,12 +4,12 @@ import dataclasses as dc
4
4
  import os
5
5
  import typing as ta
6
6
 
7
- from ..lite.check import check
8
- from ..lite.timeouts import Timeout
9
- from ..subprocesses.run import SubprocessRun
10
- from ..subprocesses.run import SubprocessRunnable
11
- from ..subprocesses.run import SubprocessRunOutput
12
- from ..subprocesses.sync import subprocesses
7
+ from ...lite.check import check
8
+ from ...lite.timeouts import Timeout
9
+ from ...subprocesses.run import SubprocessRun
10
+ from ...subprocesses.run import SubprocessRunnable
11
+ from ...subprocesses.run import SubprocessRunOutput
12
+ from ...subprocesses.sync import subprocesses
13
13
 
14
14
 
15
15
  ##
omlish/diag/procfs.py CHANGED
@@ -3,7 +3,6 @@ TODO:
3
3
  - dataclasses
4
4
  """
5
5
  import argparse
6
- import logging
7
6
  import os
8
7
  import re
9
8
  import resource
@@ -14,11 +13,12 @@ import typing as ta
14
13
  from .. import iterators as it
15
14
  from .. import lang
16
15
  from ..formats import json
16
+ from ..logs import all as logs
17
17
  from ..os.sizes import PAGE_SIZE
18
18
  from .procstats import ProcStats
19
19
 
20
20
 
21
- log = logging.getLogger(__name__)
21
+ log = logs.get_module_logger(globals())
22
22
 
23
23
 
24
24
  PidLike = int | str
@@ -235,7 +235,7 @@ PAGEMAP_KEYS = (
235
235
  )
236
236
 
237
237
 
238
- def get_process_range_pagemaps(start: int, end: int, pid: PidLike = 'self') -> ta.Iterable[dict[str, int]]:
238
+ def get_process_range_pagemaps(start: int, end: int, pid: PidLike = 'self') -> ta.Iterator[dict[str, int]]:
239
239
  """https://www.kernel.org/doc/Documentation/vm/pagemap.txt"""
240
240
 
241
241
  _check_linux()
@@ -262,7 +262,7 @@ def get_process_range_pagemaps(start: int, end: int, pid: PidLike = 'self') -> t
262
262
  }
263
263
 
264
264
 
265
- def get_process_pagemaps(pid: PidLike = 'self') -> ta.Iterable[dict[str, int]]:
265
+ def get_process_pagemaps(pid: PidLike = 'self') -> ta.Iterator[dict[str, int]]:
266
266
  _check_linux()
267
267
  for m in get_process_maps(pid):
268
268
  yield from get_process_range_pagemaps(m['address'], m['end_address'], pid)
omlish/diag/pycharm.py CHANGED
@@ -191,9 +191,23 @@ def pycharm_remote_debugger_attach(prd: PycharmRemoteDebugger) -> None:
191
191
  else:
192
192
  pydevd_pycharm = _import_pydevd_pycharm(version=version)
193
193
 
194
+ import inspect
195
+ st_sig = inspect.signature(pydevd_pycharm.settrace)
196
+
197
+ kw: dict = {}
198
+ if 'stdoutToServer' in st_sig.parameters:
199
+ kw.update(
200
+ stdoutToServer=True,
201
+ stderrToServer=True,
202
+ )
203
+ else:
204
+ kw.update(
205
+ stdout_to_server=True,
206
+ stderr_to_server=True,
207
+ )
208
+
194
209
  pydevd_pycharm.settrace(
195
210
  host,
196
211
  port=prd.port,
197
- stdoutToServer=True,
198
- stderrToServer=True,
212
+ **kw,
199
213
  )