omlish 0.0.0.dev133__py3-none-any.whl → 0.0.0.dev177__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (210) hide show
  1. omlish/.manifests.json +265 -7
  2. omlish/__about__.py +5 -3
  3. omlish/antlr/_runtime/__init__.py +0 -22
  4. omlish/antlr/_runtime/_all.py +24 -0
  5. omlish/antlr/_runtime/atn/ParserATNSimulator.py +1 -1
  6. omlish/antlr/_runtime/dfa/DFASerializer.py +1 -1
  7. omlish/antlr/_runtime/error/DiagnosticErrorListener.py +2 -1
  8. omlish/antlr/_runtime/xpath/XPath.py +7 -1
  9. omlish/antlr/_runtime/xpath/XPathLexer.py +1 -1
  10. omlish/antlr/delimit.py +106 -0
  11. omlish/antlr/dot.py +31 -0
  12. omlish/antlr/errors.py +11 -0
  13. omlish/antlr/input.py +96 -0
  14. omlish/antlr/parsing.py +19 -0
  15. omlish/antlr/runtime.py +102 -0
  16. omlish/antlr/utils.py +38 -0
  17. omlish/argparse/all.py +45 -0
  18. omlish/{argparse.py → argparse/cli.py} +112 -107
  19. omlish/asyncs/__init__.py +0 -35
  20. omlish/asyncs/all.py +35 -0
  21. omlish/asyncs/asyncio/all.py +7 -0
  22. omlish/asyncs/asyncio/channels.py +40 -0
  23. omlish/asyncs/asyncio/streams.py +45 -0
  24. omlish/asyncs/asyncio/subprocesses.py +238 -0
  25. omlish/asyncs/asyncio/timeouts.py +16 -0
  26. omlish/asyncs/bluelet/LICENSE +6 -0
  27. omlish/asyncs/bluelet/all.py +67 -0
  28. omlish/asyncs/bluelet/api.py +23 -0
  29. omlish/asyncs/bluelet/core.py +178 -0
  30. omlish/asyncs/bluelet/events.py +78 -0
  31. omlish/asyncs/bluelet/files.py +80 -0
  32. omlish/asyncs/bluelet/runner.py +416 -0
  33. omlish/asyncs/bluelet/sockets.py +214 -0
  34. omlish/bootstrap/sys.py +3 -3
  35. omlish/cached.py +2 -2
  36. omlish/check.py +49 -460
  37. omlish/codecs/__init__.py +72 -0
  38. omlish/codecs/base.py +106 -0
  39. omlish/codecs/bytes.py +119 -0
  40. omlish/codecs/chain.py +23 -0
  41. omlish/codecs/funcs.py +39 -0
  42. omlish/codecs/registry.py +139 -0
  43. omlish/codecs/standard.py +4 -0
  44. omlish/codecs/text.py +217 -0
  45. omlish/collections/cache/impl.py +50 -57
  46. omlish/collections/coerce.py +1 -0
  47. omlish/collections/mappings.py +1 -1
  48. omlish/configs/flattening.py +1 -1
  49. omlish/defs.py +1 -1
  50. omlish/diag/_pycharm/runhack.py +8 -2
  51. omlish/diag/procfs.py +8 -8
  52. omlish/docker/__init__.py +0 -36
  53. omlish/docker/all.py +31 -0
  54. omlish/docker/consts.py +4 -0
  55. omlish/{lite/docker.py → docker/detect.py} +18 -0
  56. omlish/docker/{helpers.py → timebomb.py} +0 -21
  57. omlish/formats/cbor.py +31 -0
  58. omlish/formats/cloudpickle.py +31 -0
  59. omlish/formats/codecs.py +93 -0
  60. omlish/formats/json/codecs.py +29 -0
  61. omlish/formats/json/delimted.py +4 -0
  62. omlish/formats/json/stream/errors.py +2 -0
  63. omlish/formats/json/stream/lex.py +12 -6
  64. omlish/formats/json/stream/parse.py +38 -22
  65. omlish/formats/json5.py +31 -0
  66. omlish/formats/pickle.py +31 -0
  67. omlish/formats/repr.py +25 -0
  68. omlish/formats/toml.py +17 -0
  69. omlish/formats/yaml.py +25 -0
  70. omlish/funcs/__init__.py +0 -0
  71. omlish/{genmachine.py → funcs/genmachine.py} +5 -4
  72. omlish/{matchfns.py → funcs/match.py} +1 -1
  73. omlish/funcs/pairs.py +215 -0
  74. omlish/http/__init__.py +0 -48
  75. omlish/http/all.py +48 -0
  76. omlish/http/coro/__init__.py +0 -0
  77. omlish/{lite/fdio/corohttp.py → http/coro/fdio.py} +21 -19
  78. omlish/{lite/http/coroserver.py → http/coro/server.py} +20 -21
  79. omlish/{lite/http → http}/handlers.py +3 -2
  80. omlish/{lite/http → http}/parsing.py +1 -0
  81. omlish/http/sessions.py +1 -1
  82. omlish/{lite/http → http}/versions.py +1 -0
  83. omlish/inject/managed.py +2 -2
  84. omlish/io/__init__.py +0 -3
  85. omlish/{lite/io.py → io/buffers.py} +8 -9
  86. omlish/io/compress/__init__.py +9 -0
  87. omlish/io/compress/abc.py +104 -0
  88. omlish/io/compress/adapters.py +148 -0
  89. omlish/io/compress/base.py +24 -0
  90. omlish/io/compress/brotli.py +47 -0
  91. omlish/io/compress/bz2.py +61 -0
  92. omlish/io/compress/codecs.py +78 -0
  93. omlish/io/compress/gzip.py +350 -0
  94. omlish/io/compress/lz4.py +91 -0
  95. omlish/io/compress/lzma.py +81 -0
  96. omlish/io/compress/snappy.py +34 -0
  97. omlish/io/compress/zlib.py +74 -0
  98. omlish/io/compress/zstd.py +44 -0
  99. omlish/io/fdio/__init__.py +1 -0
  100. omlish/{lite → io}/fdio/handlers.py +5 -5
  101. omlish/{lite → io}/fdio/kqueue.py +8 -8
  102. omlish/{lite → io}/fdio/manager.py +7 -7
  103. omlish/{lite → io}/fdio/pollers.py +13 -13
  104. omlish/io/generators/__init__.py +56 -0
  105. omlish/io/generators/consts.py +1 -0
  106. omlish/io/generators/direct.py +13 -0
  107. omlish/io/generators/readers.py +189 -0
  108. omlish/io/generators/stepped.py +191 -0
  109. omlish/io/pyio.py +5 -2
  110. omlish/iterators/__init__.py +24 -0
  111. omlish/iterators/iterators.py +132 -0
  112. omlish/iterators/recipes.py +18 -0
  113. omlish/iterators/tools.py +96 -0
  114. omlish/iterators/unique.py +67 -0
  115. omlish/lang/__init__.py +13 -1
  116. omlish/lang/functions.py +11 -2
  117. omlish/lang/generators.py +243 -0
  118. omlish/lang/iterables.py +46 -49
  119. omlish/lang/maybes.py +4 -4
  120. omlish/lite/cached.py +39 -6
  121. omlish/lite/check.py +438 -75
  122. omlish/lite/contextmanagers.py +17 -4
  123. omlish/lite/dataclasses.py +42 -0
  124. omlish/lite/inject.py +28 -45
  125. omlish/lite/logs.py +0 -270
  126. omlish/lite/marshal.py +309 -144
  127. omlish/lite/pycharm.py +47 -0
  128. omlish/lite/reflect.py +33 -0
  129. omlish/lite/resources.py +8 -0
  130. omlish/lite/runtime.py +4 -4
  131. omlish/lite/shlex.py +12 -0
  132. omlish/lite/socketserver.py +2 -2
  133. omlish/lite/strings.py +31 -0
  134. omlish/logs/__init__.py +0 -32
  135. omlish/logs/{_abc.py → abc.py} +0 -1
  136. omlish/logs/all.py +37 -0
  137. omlish/logs/{formatters.py → color.py} +1 -2
  138. omlish/logs/configs.py +7 -38
  139. omlish/logs/filters.py +10 -0
  140. omlish/logs/handlers.py +4 -1
  141. omlish/logs/json.py +56 -0
  142. omlish/logs/proxy.py +99 -0
  143. omlish/logs/standard.py +128 -0
  144. omlish/logs/utils.py +2 -2
  145. omlish/manifests/__init__.py +2 -0
  146. omlish/manifests/load.py +209 -0
  147. omlish/manifests/types.py +17 -0
  148. omlish/marshal/base.py +1 -1
  149. omlish/marshal/factories.py +1 -1
  150. omlish/marshal/forbidden.py +1 -1
  151. omlish/marshal/iterables.py +1 -1
  152. omlish/marshal/literals.py +50 -0
  153. omlish/marshal/mappings.py +1 -1
  154. omlish/marshal/maybes.py +1 -1
  155. omlish/marshal/standard.py +5 -1
  156. omlish/marshal/unions.py +1 -1
  157. omlish/os/__init__.py +0 -0
  158. omlish/os/atomics.py +205 -0
  159. omlish/os/deathsig.py +23 -0
  160. omlish/{os.py → os/files.py} +0 -9
  161. omlish/{lite → os}/journald.py +2 -1
  162. omlish/os/linux.py +484 -0
  163. omlish/os/paths.py +36 -0
  164. omlish/{lite → os}/pidfile.py +1 -0
  165. omlish/os/sizes.py +9 -0
  166. omlish/reflect/__init__.py +3 -0
  167. omlish/reflect/subst.py +2 -1
  168. omlish/reflect/types.py +126 -44
  169. omlish/secrets/pwhash.py +1 -1
  170. omlish/secrets/subprocesses.py +3 -1
  171. omlish/specs/jsonrpc/marshal.py +1 -1
  172. omlish/specs/openapi/marshal.py +1 -1
  173. omlish/sql/alchemy/asyncs.py +1 -1
  174. omlish/sql/queries/__init__.py +9 -1
  175. omlish/sql/queries/building.py +3 -0
  176. omlish/sql/queries/exprs.py +10 -27
  177. omlish/sql/queries/idents.py +48 -10
  178. omlish/sql/queries/names.py +80 -13
  179. omlish/sql/queries/params.py +64 -0
  180. omlish/sql/queries/rendering.py +1 -1
  181. omlish/subprocesses.py +340 -0
  182. omlish/term.py +29 -14
  183. omlish/testing/pytest/marks.py +2 -2
  184. omlish/testing/pytest/plugins/asyncs.py +6 -1
  185. omlish/testing/pytest/plugins/logging.py +1 -1
  186. omlish/testing/pytest/plugins/switches.py +1 -1
  187. {omlish-0.0.0.dev133.dist-info → omlish-0.0.0.dev177.dist-info}/METADATA +7 -5
  188. {omlish-0.0.0.dev133.dist-info → omlish-0.0.0.dev177.dist-info}/RECORD +200 -117
  189. omlish/fnpairs.py +0 -496
  190. omlish/formats/json/cli/__main__.py +0 -11
  191. omlish/formats/json/cli/cli.py +0 -298
  192. omlish/formats/json/cli/formats.py +0 -71
  193. omlish/formats/json/cli/io.py +0 -74
  194. omlish/formats/json/cli/parsing.py +0 -82
  195. omlish/formats/json/cli/processing.py +0 -48
  196. omlish/formats/json/cli/rendering.py +0 -92
  197. omlish/iterators.py +0 -300
  198. omlish/lite/subprocesses.py +0 -130
  199. /omlish/{formats/json/cli → argparse}/__init__.py +0 -0
  200. /omlish/{lite/fdio → asyncs/asyncio}/__init__.py +0 -0
  201. /omlish/asyncs/{asyncio.py → asyncio/asyncio.py} +0 -0
  202. /omlish/{lite/http → asyncs/bluelet}/__init__.py +0 -0
  203. /omlish/collections/{_abc.py → abc.py} +0 -0
  204. /omlish/{fnpipes.py → funcs/pipes.py} +0 -0
  205. /omlish/io/{_abc.py → abc.py} +0 -0
  206. /omlish/sql/{_abc.py → abc.py} +0 -0
  207. {omlish-0.0.0.dev133.dist-info → omlish-0.0.0.dev177.dist-info}/LICENSE +0 -0
  208. {omlish-0.0.0.dev133.dist-info → omlish-0.0.0.dev177.dist-info}/WHEEL +0 -0
  209. {omlish-0.0.0.dev133.dist-info → omlish-0.0.0.dev177.dist-info}/entry_points.txt +0 -0
  210. {omlish-0.0.0.dev133.dist-info → omlish-0.0.0.dev177.dist-info}/top_level.txt +0 -0
omlish/.manifests.json CHANGED
@@ -24,14 +24,272 @@
24
24
  }
25
25
  },
26
26
  {
27
- "module": ".formats.json.cli.__main__",
28
- "attr": "_CLI_MODULE",
29
- "file": "omlish/formats/json/cli/__main__.py",
30
- "line": 1,
27
+ "module": ".formats.cbor",
28
+ "attr": "_CBOR_LAZY_CODEC",
29
+ "file": "omlish/formats/cbor.py",
30
+ "line": 30,
31
31
  "value": {
32
- "$omdev.cli.types.CliModule": {
33
- "cmd_name": "json",
34
- "mod_name": "omlish.formats.json.cli.__main__"
32
+ "$.codecs.base.LazyLoadedCodec": {
33
+ "mod_name": "omlish.formats.cbor",
34
+ "attr_name": "CBOR_CODEC",
35
+ "name": "cbor",
36
+ "aliases": null
37
+ }
38
+ }
39
+ },
40
+ {
41
+ "module": ".formats.cloudpickle",
42
+ "attr": "_CLOUDPICKLE_LAZY_CODEC",
43
+ "file": "omlish/formats/cloudpickle.py",
44
+ "line": 30,
45
+ "value": {
46
+ "$.codecs.base.LazyLoadedCodec": {
47
+ "mod_name": "omlish.formats.cloudpickle",
48
+ "attr_name": "CLOUDPICKLE_CODEC",
49
+ "name": "cloudpickle",
50
+ "aliases": null
51
+ }
52
+ }
53
+ },
54
+ {
55
+ "module": ".formats.json.codecs",
56
+ "attr": "_JSON_LAZY_CODEC",
57
+ "file": "omlish/formats/json/codecs.py",
58
+ "line": 14,
59
+ "value": {
60
+ "$.codecs.base.LazyLoadedCodec": {
61
+ "mod_name": "omlish.formats.json.codecs",
62
+ "attr_name": "JSON_CODEC",
63
+ "name": "json",
64
+ "aliases": null
65
+ }
66
+ }
67
+ },
68
+ {
69
+ "module": ".formats.json.codecs",
70
+ "attr": "_JSON_COMPACT_LAZY_CODEC",
71
+ "file": "omlish/formats/json/codecs.py",
72
+ "line": 21,
73
+ "value": {
74
+ "$.codecs.base.LazyLoadedCodec": {
75
+ "mod_name": "omlish.formats.json.codecs",
76
+ "attr_name": "JSON_COMPACT_CODEC",
77
+ "name": "json-compact",
78
+ "aliases": null
79
+ }
80
+ }
81
+ },
82
+ {
83
+ "module": ".formats.json.codecs",
84
+ "attr": "_JSON_PRETTY_LAZY_CODEC",
85
+ "file": "omlish/formats/json/codecs.py",
86
+ "line": 28,
87
+ "value": {
88
+ "$.codecs.base.LazyLoadedCodec": {
89
+ "mod_name": "omlish.formats.json.codecs",
90
+ "attr_name": "JSON_PRETTY_CODEC",
91
+ "name": "json-pretty",
92
+ "aliases": null
93
+ }
94
+ }
95
+ },
96
+ {
97
+ "module": ".formats.json5",
98
+ "attr": "_JSON5_LAZY_CODEC",
99
+ "file": "omlish/formats/json5.py",
100
+ "line": 30,
101
+ "value": {
102
+ "$.codecs.base.LazyLoadedCodec": {
103
+ "mod_name": "omlish.formats.json5",
104
+ "attr_name": "JSON5_CODEC",
105
+ "name": "json5",
106
+ "aliases": null
107
+ }
108
+ }
109
+ },
110
+ {
111
+ "module": ".formats.pickle",
112
+ "attr": "_PICKLE_LAZY_CODEC",
113
+ "file": "omlish/formats/pickle.py",
114
+ "line": 30,
115
+ "value": {
116
+ "$.codecs.base.LazyLoadedCodec": {
117
+ "mod_name": "omlish.formats.pickle",
118
+ "attr_name": "PICKLE_CODEC",
119
+ "name": "pickle",
120
+ "aliases": null
121
+ }
122
+ }
123
+ },
124
+ {
125
+ "module": ".formats.repr",
126
+ "attr": "_REPR_LAZY_CODEC",
127
+ "file": "omlish/formats/repr.py",
128
+ "line": 24,
129
+ "value": {
130
+ "$.codecs.base.LazyLoadedCodec": {
131
+ "mod_name": "omlish.formats.repr",
132
+ "attr_name": "REPR_CODEC",
133
+ "name": "repr",
134
+ "aliases": null
135
+ }
136
+ }
137
+ },
138
+ {
139
+ "module": ".formats.toml",
140
+ "attr": "_TOML_LAZY_CODEC",
141
+ "file": "omlish/formats/toml.py",
142
+ "line": 16,
143
+ "value": {
144
+ "$.codecs.base.LazyLoadedCodec": {
145
+ "mod_name": "omlish.formats.toml",
146
+ "attr_name": "TOML_CODEC",
147
+ "name": "toml",
148
+ "aliases": null
149
+ }
150
+ }
151
+ },
152
+ {
153
+ "module": ".formats.yaml",
154
+ "attr": "_YAML_LAZY_CODEC",
155
+ "file": "omlish/formats/yaml.py",
156
+ "line": 258,
157
+ "value": {
158
+ "$.codecs.base.LazyLoadedCodec": {
159
+ "mod_name": "omlish.formats.yaml",
160
+ "attr_name": "YAML_CODEC",
161
+ "name": "yaml",
162
+ "aliases": [
163
+ "yml"
164
+ ]
165
+ }
166
+ }
167
+ },
168
+ {
169
+ "module": ".formats.yaml",
170
+ "attr": "_YAML_UNSAFE_LAZY_CODEC",
171
+ "file": "omlish/formats/yaml.py",
172
+ "line": 265,
173
+ "value": {
174
+ "$.codecs.base.LazyLoadedCodec": {
175
+ "mod_name": "omlish.formats.yaml",
176
+ "attr_name": "YAML_UNSAFE_CODEC",
177
+ "name": "yaml-unsafe",
178
+ "aliases": null
179
+ }
180
+ }
181
+ },
182
+ {
183
+ "module": ".io.compress.brotli",
184
+ "attr": "_BROTLI_LAZY_CODEC",
185
+ "file": "omlish/io/compress/brotli.py",
186
+ "line": 46,
187
+ "value": {
188
+ "$.codecs.base.LazyLoadedCodec": {
189
+ "mod_name": "omlish.io.compress.brotli",
190
+ "attr_name": "BROTLI_CODEC",
191
+ "name": "brotli",
192
+ "aliases": null
193
+ }
194
+ }
195
+ },
196
+ {
197
+ "module": ".io.compress.bz2",
198
+ "attr": "_BZ2_LAZY_CODEC",
199
+ "file": "omlish/io/compress/bz2.py",
200
+ "line": 60,
201
+ "value": {
202
+ "$.codecs.base.LazyLoadedCodec": {
203
+ "mod_name": "omlish.io.compress.bz2",
204
+ "attr_name": "BZ2_CODEC",
205
+ "name": "bz2",
206
+ "aliases": null
207
+ }
208
+ }
209
+ },
210
+ {
211
+ "module": ".io.compress.gzip",
212
+ "attr": "_GZIP_LAZY_CODEC",
213
+ "file": "omlish/io/compress/gzip.py",
214
+ "line": 349,
215
+ "value": {
216
+ "$.codecs.base.LazyLoadedCodec": {
217
+ "mod_name": "omlish.io.compress.gzip",
218
+ "attr_name": "GZIP_CODEC",
219
+ "name": "gzip",
220
+ "aliases": [
221
+ "gz"
222
+ ]
223
+ }
224
+ }
225
+ },
226
+ {
227
+ "module": ".io.compress.lz4",
228
+ "attr": "_LZ4_LAZY_CODEC",
229
+ "file": "omlish/io/compress/lz4.py",
230
+ "line": 90,
231
+ "value": {
232
+ "$.codecs.base.LazyLoadedCodec": {
233
+ "mod_name": "omlish.io.compress.lz4",
234
+ "attr_name": "LZ4_CODEC",
235
+ "name": "lz4",
236
+ "aliases": null
237
+ }
238
+ }
239
+ },
240
+ {
241
+ "module": ".io.compress.lzma",
242
+ "attr": "_LZMA_LAZY_CODEC",
243
+ "file": "omlish/io/compress/lzma.py",
244
+ "line": 80,
245
+ "value": {
246
+ "$.codecs.base.LazyLoadedCodec": {
247
+ "mod_name": "omlish.io.compress.lzma",
248
+ "attr_name": "LZMA_CODEC",
249
+ "name": "lzma",
250
+ "aliases": null
251
+ }
252
+ }
253
+ },
254
+ {
255
+ "module": ".io.compress.snappy",
256
+ "attr": "_SNAPPY_LAZY_CODEC",
257
+ "file": "omlish/io/compress/snappy.py",
258
+ "line": 33,
259
+ "value": {
260
+ "$.codecs.base.LazyLoadedCodec": {
261
+ "mod_name": "omlish.io.compress.snappy",
262
+ "attr_name": "SNAPPY_CODEC",
263
+ "name": "snappy",
264
+ "aliases": null
265
+ }
266
+ }
267
+ },
268
+ {
269
+ "module": ".io.compress.zlib",
270
+ "attr": "_ZLIB_LAZY_CODEC",
271
+ "file": "omlish/io/compress/zlib.py",
272
+ "line": 73,
273
+ "value": {
274
+ "$.codecs.base.LazyLoadedCodec": {
275
+ "mod_name": "omlish.io.compress.zlib",
276
+ "attr_name": "ZLIB_CODEC",
277
+ "name": "zlib",
278
+ "aliases": null
279
+ }
280
+ }
281
+ },
282
+ {
283
+ "module": ".io.compress.zstd",
284
+ "attr": "_ZSTD_LAZY_CODEC",
285
+ "file": "omlish/io/compress/zstd.py",
286
+ "line": 43,
287
+ "value": {
288
+ "$.codecs.base.LazyLoadedCodec": {
289
+ "mod_name": "omlish.io.compress.zstd",
290
+ "attr_name": "ZSTD_CODEC",
291
+ "name": "zstd",
292
+ "aliases": null
35
293
  }
36
294
  }
37
295
  },
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev133'
2
- __revision__ = 'a351cfd2f4211dfabf34e559ec14459081ef5895'
1
+ __version__ = '0.0.0.dev177'
2
+ __revision__ = '3c81e0413acb397557436f3f66780dd6e8555500'
3
3
 
4
4
 
5
5
  #
@@ -32,7 +32,7 @@ class Project(ProjectBase):
32
32
 
33
33
  optional_dependencies = {
34
34
  'async': [
35
- 'anyio ~= 4.6',
35
+ 'anyio ~= 4.7',
36
36
  'sniffio ~= 1.3',
37
37
 
38
38
  'greenlet ~= 3.1',
@@ -48,6 +48,8 @@ class Project(ProjectBase):
48
48
  'python-snappy ~= 0.7',
49
49
 
50
50
  'zstandard ~= 0.23',
51
+
52
+ 'brotli ~= 1.1',
51
53
  ],
52
54
 
53
55
  'diag': [
@@ -1,24 +1,2 @@
1
- # type: ignore
2
1
  # ruff: noqa
3
2
  # flake8: noqa
4
- from .Token import Token
5
- from .InputStream import InputStream
6
- from .FileStream import FileStream
7
- from .StdinStream import StdinStream
8
- from .BufferedTokenStream import TokenStream
9
- from .CommonTokenStream import CommonTokenStream
10
- from .Lexer import Lexer
11
- from .Parser import Parser
12
- from .dfa.DFA import DFA
13
- from .atn.ATN import ATN
14
- from .atn.ATNDeserializer import ATNDeserializer
15
- from .atn.LexerATNSimulator import LexerATNSimulator
16
- from .atn.ParserATNSimulator import ParserATNSimulator
17
- from .atn.PredictionMode import PredictionMode
18
- from .PredictionContext import PredictionContextCache
19
- from .ParserRuleContext import RuleContext, ParserRuleContext
20
- from .tree.Tree import ParseTreeListener, ParseTreeVisitor, ParseTreeWalker, TerminalNode, ErrorNode, RuleNode
21
- from .error.Errors import RecognitionException, IllegalStateException, NoViableAltException
22
- from .error.ErrorStrategy import BailErrorStrategy
23
- from .error.DiagnosticErrorListener import DiagnosticErrorListener
24
- from .Utils import str_list
@@ -0,0 +1,24 @@
1
+ # ruff: noqa
2
+ # flake8: noqa
3
+ # type: ignore
4
+ from .Token import Token
5
+ from .InputStream import InputStream
6
+ from .FileStream import FileStream
7
+ from .StdinStream import StdinStream
8
+ from .BufferedTokenStream import TokenStream
9
+ from .CommonTokenStream import CommonTokenStream
10
+ from .Lexer import Lexer
11
+ from .Parser import Parser
12
+ from .dfa.DFA import DFA
13
+ from .atn.ATN import ATN
14
+ from .atn.ATNDeserializer import ATNDeserializer
15
+ from .atn.LexerATNSimulator import LexerATNSimulator
16
+ from .atn.ParserATNSimulator import ParserATNSimulator
17
+ from .atn.PredictionMode import PredictionMode
18
+ from .PredictionContext import PredictionContextCache
19
+ from .ParserRuleContext import RuleContext, ParserRuleContext
20
+ from .tree.Tree import ParseTreeListener, ParseTreeVisitor, ParseTreeWalker, TerminalNode, ErrorNode, RuleNode
21
+ from .error.Errors import RecognitionException, IllegalStateException, NoViableAltException
22
+ from .error.ErrorStrategy import BailErrorStrategy
23
+ from .error.DiagnosticErrorListener import DiagnosticErrorListener
24
+ from .Utils import str_list
@@ -235,7 +235,7 @@
235
235
  # the input.</p>
236
236
  #
237
237
  import sys
238
- from .. import DFA
238
+ from ..dfa.DFA import DFA
239
239
  from ..BufferedTokenStream import TokenStream
240
240
  from ..Parser import Parser
241
241
  from ..ParserRuleContext import ParserRuleContext
@@ -9,7 +9,7 @@
9
9
 
10
10
  # A DFA walker that knows how to dump them to serialized strings.#/
11
11
  from io import StringIO
12
- from .. import DFA
12
+ from ..dfa.DFA import DFA
13
13
  from ..Utils import str_list
14
14
  from .DFAState import DFAState
15
15
 
@@ -28,7 +28,8 @@
28
28
  # </ul>
29
29
 
30
30
  from io import StringIO
31
- from .. import Parser, DFA
31
+ from ..Parser import Parser
32
+ from ..dfa.DFA import DFA
32
33
  from ..atn.ATNConfigSet import ATNConfigSet
33
34
  from .ErrorListener import ErrorListener
34
35
 
@@ -50,7 +50,13 @@
50
50
  # <p>
51
51
  # Whitespace is not allowed.</p>
52
52
  #
53
- from .. import CommonTokenStream, DFA, PredictionContextCache, Lexer, LexerATNSimulator, ParserRuleContext, TerminalNode
53
+ from ..CommonTokenStream import CommonTokenStream
54
+ from ..dfa.DFA import DFA
55
+ from ..PredictionContext import PredictionContextCache
56
+ from ..Lexer import Lexer
57
+ from ..atn.LexerATNSimulator import LexerATNSimulator
58
+ from ..ParserRuleContext import ParserRuleContext
59
+ from ..tree.Tree import TerminalNode
54
60
  from ..InputStream import InputStream
55
61
  from ..Parser import Parser
56
62
  from ..RuleContext import RuleContext
@@ -2,7 +2,7 @@
2
2
  # ruff: noqa
3
3
  # flake8: noqa
4
4
  # Generated from XPathLexer.g4 by ANTLR 4.11.2-SNAPSHOT
5
- from .. import *
5
+ from .._all import *
6
6
  from io import StringIO
7
7
  import sys
8
8
  if sys.version_info[1] > 5:
@@ -0,0 +1,106 @@
1
+ # ruff: noqa: N802 N815
2
+ import io
3
+ import typing as ta
4
+
5
+ from .. import check
6
+ from . import runtime as antlr4
7
+
8
+
9
+ class DelimitingLexer(antlr4.Lexer):
10
+ def __init__(
11
+ self,
12
+ *args: ta.Any,
13
+ delimiter_token: ta.Any,
14
+ delimiters: ta.Iterable[str],
15
+ no_skip: bool = False,
16
+ **kwargs,
17
+ ) -> None:
18
+ super().__init__(*args, **kwargs)
19
+
20
+ self._delimiter_token = delimiter_token
21
+ self._delimiters = set(check.not_isinstance(delimiters, str))
22
+ self._no_skip = no_skip
23
+
24
+ _hitEOF: bool
25
+
26
+ def nextToken(self) -> antlr4.Token:
27
+ if self._input is None:
28
+ raise antlr4.IllegalStateException('nextToken requires a non-null input stream.')
29
+
30
+ token_start_marker = self._input.mark()
31
+ try:
32
+ while True:
33
+ if self._hitEOF:
34
+ self.emitEOF()
35
+ return self._token
36
+
37
+ self._token: antlr4.Token | None = None
38
+ self._channel = antlr4.Token.DEFAULT_CHANNEL
39
+ self._tokenStartCharIndex = self._input.index
40
+ self._tokenStartColumn = self._interp.column
41
+ self._tokenStartLine = self._interp.line
42
+ self._text = None
43
+
44
+ continue_outer = False
45
+ while True:
46
+ self._type = antlr4.Token.INVALID_TYPE
47
+ ttype = self.SKIP
48
+
49
+ for delimiter in self._delimiters:
50
+ if self._match_delimiter(delimiter):
51
+ ttype = self._delimiter_token
52
+ break
53
+ else:
54
+ try:
55
+ ttype = self._interp.match(self._input, self._mode)
56
+ except antlr4.LexerNoViableAltException as e:
57
+ self.notifyListeners(e) # report error
58
+ self.recover(e)
59
+
60
+ if self._input.LA(1) == antlr4.Token.EOF:
61
+ self._hitEOF = True
62
+
63
+ if self._type == antlr4.Token.INVALID_TYPE:
64
+ self._type = ttype
65
+
66
+ if not self._no_skip and self._type == self.SKIP:
67
+ continue_outer = True
68
+ break
69
+
70
+ if self._type != self.MORE:
71
+ break
72
+
73
+ if continue_outer:
74
+ continue
75
+
76
+ if self._token is None:
77
+ self.emit()
78
+
79
+ return self._token
80
+
81
+ finally:
82
+ self._input.release(token_start_marker)
83
+
84
+ def _match_delimiter(self, delimiter: str) -> bool:
85
+ for i, c in enumerate(delimiter):
86
+ if chr(self._input.LA(i + 1)) != c:
87
+ return False
88
+ self._input.seek(self._input.index + len(delimiter))
89
+ return True
90
+
91
+ def split(self) -> tuple[list[tuple[str, str]], str]:
92
+ lst = []
93
+ sb = io.StringIO()
94
+ while True:
95
+ token = self.nextToken()
96
+ if token.type == antlr4.Token.EOF:
97
+ break
98
+ if token.type == self._delimiter_token:
99
+ statement = sb.getvalue().strip()
100
+ if statement:
101
+ lst.append((statement, token.text))
102
+ sb = io.StringIO()
103
+ else:
104
+ sb.write(token.text)
105
+ partial = sb.getvalue()
106
+ return lst, partial
omlish/antlr/dot.py ADDED
@@ -0,0 +1,31 @@
1
+ from ..graphs import dot
2
+ from . import runtime as antlr4
3
+ from .utils import yield_contexts
4
+
5
+
6
+ def dot_ctx(root: antlr4.ParserRuleContext) -> dot.Graph:
7
+ stmts: list[dot.Stmt] = [
8
+ dot.RawStmt('rankdir=LR;'),
9
+ ]
10
+
11
+ for c in yield_contexts(root):
12
+ if isinstance(c, antlr4.TerminalNode):
13
+ continue
14
+
15
+ lbl = [
16
+ [type(c).__name__],
17
+ [str(id(c))],
18
+ [f'{c.start} {c.stop}'],
19
+ ]
20
+
21
+ stmts.append(dot.Node(f'_{id(c)}', {'label': lbl, 'shape': 'box'}))
22
+
23
+ for n in (c.children or []):
24
+ if not isinstance(n, antlr4.TerminalNode):
25
+ stmts.append(dot.Edge(f'_{id(c)}', f'_{id(n)}'))
26
+
27
+ return dot.Graph(stmts)
28
+
29
+
30
+ def open_dot_ctx(root: antlr4.ParserRuleContext) -> None:
31
+ dot.open_dot(dot.render(dot_ctx(root)))
omlish/antlr/errors.py ADDED
@@ -0,0 +1,11 @@
1
+ # ruff: noqa: N802 N803
2
+ from . import runtime as antlr4
3
+
4
+
5
+ class ParseError(Exception):
6
+ pass
7
+
8
+
9
+ class SilentRaisingErrorListener(antlr4.ErrorListener):
10
+ def syntaxError(self, recognizer, offendingSymbol, line, column, msg, e):
11
+ raise ParseError(recognizer, offendingSymbol, line, column, msg, e)
omlish/antlr/input.py ADDED
@@ -0,0 +1,96 @@
1
+ # ruff: noqa: N802
2
+ import typing as ta
3
+
4
+
5
+ ##
6
+
7
+
8
+ # class InputStream(ta.Protocol):
9
+ #
10
+ # @property
11
+ # def index(self) -> int: ...
12
+ #
13
+ # @property
14
+ # def size(self) -> int: ...
15
+ #
16
+ # # Reset the stream so that it's in the same state it was when the object was created *except* the data array is not
17
+ # # touched.
18
+ # def reset(self) -> None: ...
19
+ #
20
+ # def consume(self) -> None: ...
21
+ #
22
+ # def LA(self, offset: int) -> int: ...
23
+ #
24
+ # def LT(self, offset: int) -> int: ...
25
+ #
26
+ # def mark(self) -> int: ...
27
+ #
28
+ # def release(self, marker: int) -> None: ...
29
+ #
30
+ # # consume() ahead until p==_index; can't just set p=_index as we must update line and column. If we seek backwards,
31
+ # # just set p
32
+ # def seek(self, _index: int) -> None: ...
33
+ #
34
+ # def getText(self, start: int, stop: int) -> str: ...
35
+ #
36
+ # def __str__(self) -> str: ...
37
+
38
+
39
+ InputStream: ta.TypeAlias = ta.Any
40
+
41
+
42
+ ##
43
+
44
+
45
+ # @lang.protocol_check(InputStream)
46
+ class ProxyInputStream:
47
+ def __init__(self, target: InputStream) -> None:
48
+ super().__init__()
49
+
50
+ self._target = target
51
+
52
+ @property
53
+ def index(self) -> int:
54
+ return self._target.index
55
+
56
+ @property
57
+ def size(self) -> int:
58
+ return self._target.size
59
+
60
+ def reset(self) -> None:
61
+ self._target.reset()
62
+
63
+ def consume(self) -> None:
64
+ self._target.consume()
65
+
66
+ def LA(self, offset: int) -> int:
67
+ return self._target.LA(offset)
68
+
69
+ def LT(self, offset: int) -> int:
70
+ return self._target.LT(offset)
71
+
72
+ def mark(self) -> int:
73
+ return self._target.mark()
74
+
75
+ def release(self, marker: int) -> None:
76
+ return self._target.release(marker)
77
+
78
+ def seek(self, _index: int) -> None:
79
+ return self._target.seek(_index)
80
+
81
+ def getText(self, start: int, stop: int) -> str:
82
+ return self._target.getText(start, stop)
83
+
84
+ def __str__(self) -> str:
85
+ return str(self._target)
86
+
87
+
88
+ ##
89
+
90
+
91
+ class CaseInsensitiveInputStream(ProxyInputStream):
92
+ def LA(self, offset: int) -> int:
93
+ ret = super().LA(offset)
94
+ if ret != -1:
95
+ ret = ord(chr(ret).upper())
96
+ return ret
@@ -0,0 +1,19 @@
1
+ # ruff: noqa: N802 N803
2
+ import typing as ta
3
+
4
+ from . import runtime as antlr4
5
+
6
+
7
+ LexerT = ta.TypeVar('LexerT', bound=antlr4.Lexer)
8
+ ParserT = ta.TypeVar('ParserT', bound=antlr4.Parser)
9
+
10
+
11
+ def parse(
12
+ buf: str,
13
+ lexer_cls: type[LexerT],
14
+ parser_cls: type[ParserT],
15
+ ) -> ParserT:
16
+ lexer = lexer_cls(antlr4.InputStream(buf))
17
+ stream = antlr4.CommonTokenStream(lexer)
18
+ stream.fill()
19
+ return parser_cls(stream)