omlish 0.0.0.dev135__py3-none-any.whl → 0.0.0.dev136__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.
Files changed (35) hide show
  1. omlish/.manifests.json +0 -12
  2. omlish/__about__.py +2 -2
  3. omlish/formats/json/stream/lex.py +1 -1
  4. omlish/formats/json/stream/parse.py +1 -1
  5. omlish/{matchfns.py → funcs/match.py} +1 -1
  6. omlish/{fnpairs.py → funcs/pairs.py} +3 -3
  7. omlish/http/sessions.py +1 -1
  8. omlish/marshal/base.py +1 -1
  9. omlish/marshal/factories.py +1 -1
  10. omlish/marshal/forbidden.py +1 -1
  11. omlish/marshal/iterables.py +1 -1
  12. omlish/marshal/mappings.py +1 -1
  13. omlish/marshal/maybes.py +1 -1
  14. omlish/marshal/standard.py +1 -1
  15. omlish/marshal/unions.py +1 -1
  16. omlish/secrets/pwhash.py +1 -1
  17. omlish/secrets/subprocesses.py +3 -1
  18. omlish/specs/jsonrpc/marshal.py +1 -1
  19. omlish/specs/openapi/marshal.py +1 -1
  20. {omlish-0.0.0.dev135.dist-info → omlish-0.0.0.dev136.dist-info}/METADATA +1 -1
  21. {omlish-0.0.0.dev135.dist-info → omlish-0.0.0.dev136.dist-info}/RECORD +28 -35
  22. omlish/formats/json/cli/__main__.py +0 -11
  23. omlish/formats/json/cli/cli.py +0 -298
  24. omlish/formats/json/cli/formats.py +0 -71
  25. omlish/formats/json/cli/io.py +0 -74
  26. omlish/formats/json/cli/parsing.py +0 -82
  27. omlish/formats/json/cli/processing.py +0 -48
  28. omlish/formats/json/cli/rendering.py +0 -92
  29. /omlish/{formats/json/cli → funcs}/__init__.py +0 -0
  30. /omlish/{genmachine.py → funcs/genmachine.py} +0 -0
  31. /omlish/{fnpipes.py → funcs/pipes.py} +0 -0
  32. {omlish-0.0.0.dev135.dist-info → omlish-0.0.0.dev136.dist-info}/LICENSE +0 -0
  33. {omlish-0.0.0.dev135.dist-info → omlish-0.0.0.dev136.dist-info}/WHEEL +0 -0
  34. {omlish-0.0.0.dev135.dist-info → omlish-0.0.0.dev136.dist-info}/entry_points.txt +0 -0
  35. {omlish-0.0.0.dev135.dist-info → omlish-0.0.0.dev136.dist-info}/top_level.txt +0 -0
omlish/.manifests.json CHANGED
@@ -23,18 +23,6 @@
23
23
  }
24
24
  }
25
25
  },
26
- {
27
- "module": ".formats.json.cli.__main__",
28
- "attr": "_CLI_MODULE",
29
- "file": "omlish/formats/json/cli/__main__.py",
30
- "line": 1,
31
- "value": {
32
- "$omdev.cli.types.CliModule": {
33
- "cmd_name": "json",
34
- "mod_name": "omlish.formats.json.cli.__main__"
35
- }
36
- }
37
- },
38
26
  {
39
27
  "module": ".secrets.pwgen",
40
28
  "attr": "_CLI_MODULE",
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev135'
2
- __revision__ = 'bf47c29e2fe6b065c99ce565d89f133b798895d9'
1
+ __version__ = '0.0.0.dev136'
2
+ __revision__ = '345b1984bd3c96dc1b3ed4db8402e21d989f38ee'
3
3
 
4
4
 
5
5
  #
@@ -11,7 +11,7 @@ import re
11
11
  import typing as ta
12
12
 
13
13
  from .... import check
14
- from ....genmachine import GenMachine
14
+ from ....funcs.genmachine import GenMachine
15
15
 
16
16
 
17
17
  ##
@@ -1,7 +1,7 @@
1
1
  import typing as ta
2
2
 
3
3
  from .... import lang
4
- from ....genmachine import GenMachine
4
+ from ....funcs.genmachine import GenMachine
5
5
  from .lex import SCALAR_VALUE_TYPES
6
6
  from .lex import VALUE_TOKEN_KINDS
7
7
  from .lex import ScalarValue
@@ -8,7 +8,7 @@ import abc
8
8
  import dataclasses as dc
9
9
  import typing as ta
10
10
 
11
- from . import lang
11
+ from .. import lang
12
12
 
13
13
 
14
14
  T = ta.TypeVar('T')
@@ -20,7 +20,7 @@ import codecs
20
20
  import dataclasses as dc
21
21
  import typing as ta
22
22
 
23
- from . import lang
23
+ from .. import lang
24
24
 
25
25
 
26
26
  if ta.TYPE_CHECKING:
@@ -39,7 +39,7 @@ if ta.TYPE_CHECKING:
39
39
  import yaml as _yaml
40
40
  import zstandard as _zstandard
41
41
 
42
- from .formats import json as _json
42
+ from ..formats import json as _json
43
43
 
44
44
  else:
45
45
  _bz2 = lang.proxy_import('bz2')
@@ -57,7 +57,7 @@ else:
57
57
  _yaml = lang.proxy_import('yaml')
58
58
  _zstandard = lang.proxy_import('zstandard')
59
59
 
60
- _json = lang.proxy_import('.formats.json', __package__)
60
+ _json = lang.proxy_import('..formats.json', __package__)
61
61
 
62
62
 
63
63
  ##
omlish/http/sessions.py CHANGED
@@ -8,9 +8,9 @@ import time
8
8
  import typing as ta
9
9
  import zlib
10
10
 
11
- from .. import fnpairs as fpa
12
11
  from .. import lang
13
12
  from .. import secrets as sec
13
+ from ..funcs import pairs as fpa
14
14
  from .cookies import dump_cookie
15
15
  from .cookies import parse_cookie
16
16
  from .json import JSON_TAGGER
omlish/marshal/base.py CHANGED
@@ -89,8 +89,8 @@ from .. import check
89
89
  from .. import collections as col
90
90
  from .. import dataclasses as dc
91
91
  from .. import lang
92
- from .. import matchfns as mfs
93
92
  from .. import reflect as rfl
93
+ from ..funcs import match as mfs
94
94
  from .exceptions import UnhandledTypeError
95
95
  from .factories import RecursiveTypeFactory
96
96
  from .factories import TypeCacheFactory
@@ -3,8 +3,8 @@ import threading
3
3
  import typing as ta
4
4
 
5
5
  from .. import check
6
- from .. import matchfns as mfs
7
6
  from .. import reflect as rfl
7
+ from ..funcs import match as mfs
8
8
 
9
9
 
10
10
  R = ta.TypeVar('R')
@@ -1,8 +1,8 @@
1
1
  import dataclasses as dc
2
2
  import typing as ta
3
3
 
4
- from .. import matchfns as mfs
5
4
  from .. import reflect as rfl
5
+ from ..funcs import match as mfs
6
6
  from .base import MarshalContext
7
7
  from .base import Marshaler
8
8
  from .base import UnmarshalContext
@@ -8,8 +8,8 @@ import functools
8
8
  import typing as ta
9
9
 
10
10
  from .. import check
11
- from .. import matchfns as mfs
12
11
  from .. import reflect as rfl
12
+ from ..funcs import match as mfs
13
13
  from .base import MarshalContext
14
14
  from .base import Marshaler
15
15
  from .base import MarshalerFactoryMatchClass
@@ -3,8 +3,8 @@ import dataclasses as dc
3
3
  import typing as ta
4
4
 
5
5
  from .. import check
6
- from .. import matchfns as mfs
7
6
  from .. import reflect as rfl
7
+ from ..funcs import match as mfs
8
8
  from .base import MarshalContext
9
9
  from .base import Marshaler
10
10
  from .base import MarshalerFactoryMatchClass
omlish/marshal/maybes.py CHANGED
@@ -7,8 +7,8 @@ import typing as ta
7
7
 
8
8
  from .. import check
9
9
  from .. import lang
10
- from .. import matchfns as mfs
11
10
  from .. import reflect as rfl
11
+ from ..funcs import match as mfs
12
12
  from .base import MarshalContext
13
13
  from .base import Marshaler
14
14
  from .base import MarshalerFactoryMatchClass
@@ -1,4 +1,4 @@
1
- from .. import matchfns as mfs
1
+ from ..funcs import match as mfs
2
2
  from .any import ANY_MARSHALER_FACTORY
3
3
  from .any import ANY_UNMARSHALER_FACTORY
4
4
  from .base import MarshalerFactory
omlish/marshal/unions.py CHANGED
@@ -4,8 +4,8 @@ from .. import cached
4
4
  from .. import check
5
5
  from .. import dataclasses as dc
6
6
  from .. import lang
7
- from .. import matchfns as mfs
8
7
  from .. import reflect as rfl
8
+ from ..funcs import match as mfs
9
9
  from .base import MarshalContext
10
10
  from .base import Marshaler
11
11
  from .base import MarshalerFactory
omlish/secrets/pwhash.py CHANGED
@@ -28,7 +28,7 @@ import secrets
28
28
 
29
29
 
30
30
  SALT_CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
31
- DEFAULT_PBKDF2_ITERATIONS = 600000
31
+ DEFAULT_PBKDF2_ITERATIONS = 600_000
32
32
 
33
33
 
34
34
  def gen_salt(length: int) -> str:
@@ -32,7 +32,9 @@ def pipe_fd_subprocess_file_input(buf: bytes) -> ta.Iterator[SubprocessFileInput
32
32
  try:
33
33
  if hasattr(fcntl, 'F_SETPIPE_SZ'):
34
34
  fcntl.fcntl(wfd, fcntl.F_SETPIPE_SZ, max(len(buf), 0x1000))
35
- os.write(wfd, buf)
35
+ n = os.write(wfd, buf)
36
+ if n != len(buf):
37
+ raise OSError(f'Failed to write data to pipe: {n=} {len(buf)=}')
36
38
  os.close(wfd)
37
39
  closed_wfd = True
38
40
  yield SubprocessFileInput(f'/dev/fd/{rfd}', [rfd])
@@ -4,8 +4,8 @@ from ... import check
4
4
  from ... import dataclasses as dc
5
5
  from ... import lang
6
6
  from ... import marshal as msh
7
- from ... import matchfns as mfs
8
7
  from ... import reflect as rfl
8
+ from ...funcs import match as mfs
9
9
  from .types import NotSpecified
10
10
 
11
11
 
@@ -4,8 +4,8 @@ from ... import check
4
4
  from ... import dataclasses as dc
5
5
  from ... import lang
6
6
  from ... import marshal as msh
7
- from ... import matchfns as mfs
8
7
  from ... import reflect as rfl
8
+ from ...funcs import match as mfs
9
9
  from .openapi import Reference
10
10
 
11
11
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev135
3
+ Version: 0.0.0.dev136
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
- omlish/.manifests.json,sha256=CxGnj-UiRPlZgmgWoovDWrOnqpSEmBy_kqA7cdfSA3w,1431
2
- omlish/__about__.py,sha256=v2e0yLh0hfZ_l8fAvWlrUY6UTj7j9U62ZZUsPMsDHPI,3379
1
+ omlish/.manifests.json,sha256=RX24SRc6DCEg77PUVnaXOKCWa5TF_c9RQJdGIf7gl9c,1135
2
+ omlish/__about__.py,sha256=CWnfySakfsMZZD27TmuHHIWSs20C8yL_8HidsVhkFwM,3379
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/argparse.py,sha256=cqKGAqcxuxv_s62z0gq29L9KAvg_3-_rFvXKjVpRJjo,8126
5
5
  omlish/c3.py,sha256=ubu7lHwss5V4UznbejAI0qXhXahrU01MysuHOZI9C4U,8116
@@ -8,12 +8,8 @@ omlish/check.py,sha256=Li5xmecEyWKMzlwWyd6xDHpq3F4lE6IFOPBWdylCnpU,10540
8
8
  omlish/datetimes.py,sha256=HajeM1kBvwlTa-uR1TTZHmZ3zTPnnUr1uGGQhiO1XQ0,2152
9
9
  omlish/defs.py,sha256=T3bq_7h_tO3nDB5RAFBn7DkdeQgqheXzkFColbOHZko,4890
10
10
  omlish/dynamic.py,sha256=35C_cCX_Vq2HrHzGk5T-zbrMvmUdiIiwDzDNixczoDo,6541
11
- omlish/fnpairs.py,sha256=3ZPV5DRTWSFA8_DYKL4iXT-E4483QdfUfshs-X_UVIs,10603
12
- omlish/fnpipes.py,sha256=E7Sz8Aj8ke_vCs5AMNwg1I36kRdHVGTnzxVQaDyn43U,2490
13
- omlish/genmachine.py,sha256=RlU-y_dt2nRdvoo7Z3HsUELlBn3KuyI4qUnqLVbChRI,2450
14
11
  omlish/iterators.py,sha256=GGLC7RIT86uXMjhIIIqnff_Iu5SI_b9rXYywYGFyzmo,7292
15
12
  omlish/libc.py,sha256=8r7Ejyhttk9ruCfBkxNTrlzir5WPbDE2vmY7VPlceMA,15362
16
- omlish/matchfns.py,sha256=I1IlQGfEyk_AcFSy6ulVS3utC-uwyZM2YfUXYHc9Bw0,6152
17
13
  omlish/multiprocessing.py,sha256=QZT4C7I-uThCAjaEY3xgUYb-5GagUlnE4etN01LDyU4,5186
18
14
  omlish/os.py,sha256=5nJ-a9JKSMoaZVZ1eOa5BAbfL7o7CF7ue_PyJwufnwY,1460
19
15
  omlish/runmodule.py,sha256=PWvuAaJ9wQQn6bx9ftEL3_d04DyotNn8dR_twm2pgw0,700
@@ -196,19 +192,16 @@ omlish/formats/json/backends/jiter.py,sha256=8qv_XWGpcupPtVm6Z_egHio_iY1Kk8eqkvX
196
192
  omlish/formats/json/backends/orjson.py,sha256=wR8pMGFtkhZGHcNVk7vNYUnv8lUapdK89p6QpETIs9w,3778
197
193
  omlish/formats/json/backends/std.py,sha256=PM00Kh9ZR2XzollHMEvdo35Eml1N-zFfRW-LOCV5ftM,3085
198
194
  omlish/formats/json/backends/ujson.py,sha256=BNJCU4kluGHdqTUKLJEuHhE2m2TmqR7HEN289S0Eokg,2278
199
- omlish/formats/json/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
200
- omlish/formats/json/cli/__main__.py,sha256=1wxxKZVkj_u7HCcewwMIbGuZj_Wph95yrUbm474Op9M,188
201
- omlish/formats/json/cli/cli.py,sha256=dRtkX9cqXmff0RnYXAyXX324zbi2z0cg2Efp_5BOx0k,9575
202
- omlish/formats/json/cli/formats.py,sha256=FUZ0ptn3n0ljei2_o0t5UtmZkMB3_5p1pE-hgDD3-ak,1721
203
- omlish/formats/json/cli/io.py,sha256=IoJ5asjS_gUan5TcrGgS0KpJaiSE5YQgEGljFMCcDto,1427
204
- omlish/formats/json/cli/parsing.py,sha256=GfD6Om9FDaTJ662qROKSftSdp95tbw22Ids_vkMJV7U,2100
205
- omlish/formats/json/cli/processing.py,sha256=UXHA_5El1qSDjPlJBBfREzHA_T2GNmP6nD1X99GNqOM,1214
206
- omlish/formats/json/cli/rendering.py,sha256=cmnGAUqY0vKlMYHMBydIBgbs23Isdobf1F8cRk8o9f0,2182
207
195
  omlish/formats/json/stream/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
208
196
  omlish/formats/json/stream/build.py,sha256=MSxgreWSfI5CzNAdgQrArZ0yWqDsaHl-shI_jmjLDms,2505
209
- omlish/formats/json/stream/lex.py,sha256=_JYoWFRpo3_dQmT7xXCWGFNoBT4M8m97G9oGzwPZeo4,6483
210
- omlish/formats/json/stream/parse.py,sha256=WkbW7tvcdrTSluKhw70nPvjsq943eryVcjx8FSz78tM,5198
197
+ omlish/formats/json/stream/lex.py,sha256=_JYBFnAyHsw_3hu8I0rvZqSSkRCU1BvQzgO81KfqRBg,6489
198
+ omlish/formats/json/stream/parse.py,sha256=s21PgiuNTcqc_i9QS1ggmEp8Qwp_hOqtosr5d0zpg_o,5204
211
199
  omlish/formats/json/stream/render.py,sha256=NtmDsN92xZi5dkgSSuMeMXMAiJblmjz1arB4Ft7vBhc,3715
200
+ omlish/funcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
201
+ omlish/funcs/genmachine.py,sha256=RlU-y_dt2nRdvoo7Z3HsUELlBn3KuyI4qUnqLVbChRI,2450
202
+ omlish/funcs/match.py,sha256=gMLZn1enNiFvQaWrQubY300M1BrmdKWzeePihBS7Ywc,6153
203
+ omlish/funcs/pairs.py,sha256=OzAwnALkRJXVpD47UvBZHKzQfHtFNry_EgjTcC7vgLU,10606
204
+ omlish/funcs/pipes.py,sha256=E7Sz8Aj8ke_vCs5AMNwg1I36kRdHVGTnzxVQaDyn43U,2490
212
205
  omlish/graphs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
213
206
  omlish/graphs/dags.py,sha256=zp55lYgUdRCxmADwiGDHeehMJczZFA_tzdWqy77icOk,3047
214
207
  omlish/graphs/domination.py,sha256=oCGoWzWTxLwow0LDyGjjEf2AjFiOiDz4WaBtczwSbsQ,7576
@@ -229,7 +222,7 @@ omlish/http/headers.py,sha256=ZMmjrEiYjzo0YTGyK0YsvjdwUazktGqzVVYorY4fd44,5081
229
222
  omlish/http/json.py,sha256=9XwAsl4966Mxrv-1ytyCqhcE6lbBJw-0_tFZzGszgHE,7440
230
223
  omlish/http/jwt.py,sha256=6Rigk1WrJ059DY4jDIKnxjnChWb7aFdermj2AI2DSvk,4346
231
224
  omlish/http/multipart.py,sha256=R9ycpHsXRcmh0uoc43aYb7BdWL-8kSQHe7J-M81aQZM,2240
232
- omlish/http/sessions.py,sha256=VZ_WS5uiQG5y7i3u8oKuQMqf8dPKUOjFm_qk_0OvI8c,4793
225
+ omlish/http/sessions.py,sha256=WVRTy2KjehwQiYTPn7r44gZ4Pqg8sDC_9-wiYON0344,4796
233
226
  omlish/http/sse.py,sha256=MDs9RvxQXoQliImcc6qK1ERajEYM7Q1l8xmr-9ceNBc,2315
234
227
  omlish/http/wsgi.py,sha256=czZsVUX-l2YTlMrUjKN49wRoP4rVpS0qpeBn4O5BoMY,948
235
228
  omlish/inject/__init__.py,sha256=n0RC9UDGsBQQ39cST39-XJqJPq2M0tnnh9yJubW9azo,1891
@@ -339,19 +332,19 @@ omlish/logs/noisy.py,sha256=Ubc-eTH6ZbGYsLfUUi69JAotwuUwzb-SJBeGo_0dIZI,348
339
332
  omlish/logs/utils.py,sha256=MgGovbP0zUrZ3FGD3qYNQWn-l0jy0Y0bStcQvv5BOmQ,391
340
333
  omlish/marshal/__init__.py,sha256=iVA7n31L08Bdub6HKPvYOXVvDhk2CMA6rPeKDL_u1to,2298
341
334
  omlish/marshal/any.py,sha256=e82OyYK3Emm1P1ClnsnxP7fIWC2iNVyW0H5nK4mLmWM,779
342
- omlish/marshal/base.py,sha256=7ZpJOMPlvtslhDdRlNZCC5MiUGu7Qfoq_S_miD0lmQY,6738
335
+ omlish/marshal/base.py,sha256=HEzfby-PgGzIhiRpBkFrkw5-hKacRSC5W_jwLjT8aYw,6740
343
336
  omlish/marshal/base64.py,sha256=F-3ogJdcFCtWINRgJgWT0rErqgx6f4qahhcg8OrkqhE,1089
344
337
  omlish/marshal/dataclasses.py,sha256=G6Uh8t4vvNBAx2BhzH8ksj8Hq_bo6npFphQhyF298VU,6892
345
338
  omlish/marshal/datetimes.py,sha256=0ffg8cEvx9SMKIXZGD9b7MqpLfmgw0uKKdn6YTfoqok,3714
346
339
  omlish/marshal/enums.py,sha256=CMAbx6RI2EcQoo7SoD-5q2l-3DFKreWMiOxs6mFpl_4,1472
347
340
  omlish/marshal/exceptions.py,sha256=jwQWn4LcPnadT2KRI_1JJCOSkwWh0yHnYK9BmSkNN4U,302
348
- omlish/marshal/factories.py,sha256=UV2Svjok-lTWsRqKGh-CeuAhvlohw9uJe7ZLyoKMvTM,2968
349
- omlish/marshal/forbidden.py,sha256=BNshzm4lN5O8sUZ1YvxrSYq3WPklq9NMQCRZ7RC3DLM,865
341
+ omlish/marshal/factories.py,sha256=Q926jSVjaQLEmStnHLhm_c_vqEysN1LnDCwAsFLIzXw,2970
342
+ omlish/marshal/forbidden.py,sha256=NDe828hqCQw-AgxcEm8MiDZNxWoBwf3o7sTyvQsSsQ0,867
350
343
  omlish/marshal/global_.py,sha256=K76wB1-pdg4VWgiqR7wyxRNYr-voJApexYW2nV-R4DM,1127
351
344
  omlish/marshal/helpers.py,sha256=-SOgYJmrURILHpPK6Wu3cCvhj8RJrqfJxuKhh9UMs7o,1102
352
- omlish/marshal/iterables.py,sha256=sPkbWJa6gSbAxsVojLDqF4BZA_xURmlXkHM4yJ1Jh2s,2630
353
- omlish/marshal/mappings.py,sha256=s2cFSLyo0PM1eoQ2-SONtFSOldk5ARsBj55-icvWZ5o,2787
354
- omlish/marshal/maybes.py,sha256=mgK3QsWHkXgRqo076KxYKH6elRxzJ_QDTodv93mgHR0,2198
345
+ omlish/marshal/iterables.py,sha256=H9FoCB5RlJW0SVSi3SBD6sxOXN9XRTOUkHRwCYSqRb8,2632
346
+ omlish/marshal/mappings.py,sha256=XcNOaV708ZHeuIrWiFHC6F1O6U9NyyTKUurvXwIryJo,2789
347
+ omlish/marshal/maybes.py,sha256=i-gOQJ-7tdt6sOazAeyCh4N71SK3jWv-BKlkx-fZm-s,2200
355
348
  omlish/marshal/namedtuples.py,sha256=H0icxcE5FrqgfI9dRc8LlXJy430g_yuILTCVD0Zvfd0,2799
356
349
  omlish/marshal/naming.py,sha256=lIklR_Od4x1ghltAgOzqcKhHs-leeSv2YmFhCHO7GIs,613
357
350
  omlish/marshal/newtypes.py,sha256=fRpXLoCpoiaqcvl7v92I1_Qt7udn4vsPc1P3UfcBu-8,841
@@ -362,8 +355,8 @@ omlish/marshal/optionals.py,sha256=r0XB5rqfasvgZJNrKYd6Unq2U4nHt3JURi26j0dYHlw,1
362
355
  omlish/marshal/polymorphism.py,sha256=2SxrfneA9QdhNdxieEGFnHDHpUo3ftETA9dMbCbmbWY,6511
363
356
  omlish/marshal/primitives.py,sha256=f_6m24Cb-FDGsZpYSas11nLt3xCCEUXugw3Hv4-aNhg,1291
364
357
  omlish/marshal/registries.py,sha256=FvC6qXHCizNB2QmU_N3orxW7iqfGYkiUXYYdTRWS6HA,2353
365
- omlish/marshal/standard.py,sha256=jarT6qEzwIAnZiJ24__AnNWVOJPV9z7LY_fvLvlwEWM,3319
366
- omlish/marshal/unions.py,sha256=Ghd1robwbCXqd5ssmgjIBf1nQ_A0RlIoL49VQQrSRyo,4355
358
+ omlish/marshal/standard.py,sha256=UMET8wkxf__ApIDuVcoCKsjNWwZejbICLeXhhmn56Nk,3321
359
+ omlish/marshal/unions.py,sha256=tT4W-mxuPi7s_kdl25_AUltsurYPO_0mQl2CiVmNonY,4357
367
360
  omlish/marshal/utils.py,sha256=puKJpwPpuDlMOIrKMcLTRLJyMiL6n_Xs-p59AuDEymA,543
368
361
  omlish/marshal/uuids.py,sha256=H4B7UX_EPNmP2tC8bubcKrPLTS4aQu98huvbXQ3Zv2g,910
369
362
  omlish/marshal/values.py,sha256=ssHiWdg_L6M17kAn8GiGdPW7UeQOm3RDikWkvwblf5I,263
@@ -381,9 +374,9 @@ omlish/secrets/crypto.py,sha256=6CsLy0UEqCrBK8Xx_3-iFF6SKtu2GlEqUQ8-MliY3tk,3709
381
374
  omlish/secrets/marshal.py,sha256=U9uSRTWzZmumfNZeh_dROwVdGrARsp155TylRbjilP8,2048
382
375
  omlish/secrets/openssl.py,sha256=wxA_wIlxtuOUy71ABxAJgavh-UI_taOfm-A0dVlmSwM,6219
383
376
  omlish/secrets/pwgen.py,sha256=v-5ztnOTHTAWXLGR-3H6HkMj2nPIZBMbo5xWR3q0rDY,1707
384
- omlish/secrets/pwhash.py,sha256=3r-vEK6Gp6aq4L5Csnd06QnrjO9xfzHJP-g_7I9W_ao,4101
377
+ omlish/secrets/pwhash.py,sha256=Goktn-swmC6PXqfRBnDrH_Lr42vjckT712UyErPjzkw,4102
385
378
  omlish/secrets/secrets.py,sha256=cnDGBoPknVxsCN04_gqcJT_7Ebk3iO3VPkRZ2oMjkMw,7868
386
- omlish/secrets/subprocesses.py,sha256=EcnKlHHtnUMHGrBWXDfu8tv28wlgZx4P4GOiuPW9Vo8,1105
379
+ omlish/secrets/subprocesses.py,sha256=ffjfbgPbEE_Pwb_87vG4yYR2CGZy3I31mHNCo_0JtHw,1212
387
380
  omlish/specs/__init__.py,sha256=zZwF8yXTEkSstYtORkDhVLK-_hWU8WOJCuBpognb_NY,118
388
381
  omlish/specs/jmespath/LICENSE,sha256=IH-ZZlZkS8XMkf_ubNVD1aYHQ2l_wd0tmHtXrCcYpRU,1113
389
382
  omlish/specs/jmespath/__init__.py,sha256=9tsrquw1kXe1KAhTP3WeL0GlGBiTguQVxsC-lUYTWP4,2087
@@ -398,7 +391,7 @@ omlish/specs/jmespath/scope.py,sha256=UyDsl9rv_c8DCjJBuVIA2ESu1jrgYvuwEKiaJDQKnT
398
391
  omlish/specs/jmespath/visitor.py,sha256=yneRMO4qf3k2Mdcm2cPC0ozRgOaudzlxRVRGatztJzs,16569
399
392
  omlish/specs/jsonrpc/__init__.py,sha256=E0EogYSKmbj1D-V57tBgPDTyVuD8HosHqVg0Vh1CVwM,416
400
393
  omlish/specs/jsonrpc/errors.py,sha256=-Zgmlo6bV6J8w5f8h9axQgLquIFBHDgIwcpufEH5NsE,707
401
- omlish/specs/jsonrpc/marshal.py,sha256=iXZNR7n0vfL_yiPFFYN-ZyGlzknNXExs2qC1HFChGPU,1913
394
+ omlish/specs/jsonrpc/marshal.py,sha256=hM1rPZddoha_87qcQtBWkyaZshCXlPoHPJg6J_nBi9k,1915
402
395
  omlish/specs/jsonrpc/types.py,sha256=g19j2_FCVJDXFqAkQ5U4LICkL4Z7vEBMU0t_aOEqio4,2159
403
396
  omlish/specs/jsonschema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
404
397
  omlish/specs/jsonschema/types.py,sha256=qoxExgKfrI-UZXdk3qcVZIEyp1WckFbb85_eGInEoAY,467
@@ -423,7 +416,7 @@ omlish/specs/jsonschema/schemas/draft202012/vocabularies/meta-data.json,sha256=j
423
416
  omlish/specs/jsonschema/schemas/draft202012/vocabularies/unevaluated.json,sha256=Lb-8tzmUtnCwl2SSre4f_7RsIWgnhNL1pMpWH54tDLQ,506
424
417
  omlish/specs/jsonschema/schemas/draft202012/vocabularies/validation.json,sha256=cBCjHlQfMtK-ch4t40jfdcmzaHaj7TBId_wKvaHTelg,2834
425
418
  omlish/specs/openapi/__init__.py,sha256=zilQhafjvteRDF_TUIRgF293dBC6g-TJChmUb6T9VBQ,77
426
- omlish/specs/openapi/marshal.py,sha256=ob_qUbT9-de86KhPjFccl_NP0liQcXK7Ao-b5Hn0VQA,2133
419
+ omlish/specs/openapi/marshal.py,sha256=Z-E2Knm04C81N8AA8cibCVSl2ImhSpHZVc7yAhmPx88,2135
427
420
  omlish/specs/openapi/openapi.py,sha256=y4h04jeB7ORJSVrcy7apaBdpwLjIyscv1Ub5SderH2c,12682
428
421
  omlish/sql/__init__.py,sha256=TpZLsEJKJzvJ0eMzuV8hwOJJbkxBCV1RZPUMLAVB6io,173
429
422
  omlish/sql/_abc.py,sha256=kiOitW_ZhTXrJanJ582wD7o9K69v6HXqDPkxuHEAxrc,1606
@@ -487,9 +480,9 @@ omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,329
487
480
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
488
481
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
489
482
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
490
- omlish-0.0.0.dev135.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
491
- omlish-0.0.0.dev135.dist-info/METADATA,sha256=FzsPMJSJzeIUc8mYwPYfE1NNy3xXUjCA3CiZllCo9xI,4173
492
- omlish-0.0.0.dev135.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
493
- omlish-0.0.0.dev135.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
494
- omlish-0.0.0.dev135.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
495
- omlish-0.0.0.dev135.dist-info/RECORD,,
483
+ omlish-0.0.0.dev136.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
484
+ omlish-0.0.0.dev136.dist-info/METADATA,sha256=heiHEjvH_MYIlgwIfTWaObhQg178414yEPPo1_ZbNjU,4173
485
+ omlish-0.0.0.dev136.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
486
+ omlish-0.0.0.dev136.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
487
+ omlish-0.0.0.dev136.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
488
+ omlish-0.0.0.dev136.dist-info/RECORD,,
@@ -1,11 +0,0 @@
1
- # @omlish-manifest
2
- _CLI_MODULE = {'$omdev.cli.types.CliModule': {
3
- 'cmd_name': 'json',
4
- 'mod_name': __name__,
5
- }}
6
-
7
-
8
- if __name__ == '__main__':
9
- from .cli import _main
10
-
11
- _main()
@@ -1,298 +0,0 @@
1
- """
2
- TODO:
3
- - read from http
4
- - jmespath output flat, unquoted strs like jq '.[]'
5
-
6
- ==
7
-
8
- jq Command options:
9
- -n, --null-input use `null` as the single input value;
10
- -R, --raw-input read each line as string instead of JSON;
11
- -s, --slurp read all inputs into an array and use it as the single input value;
12
- -c, --compact-output compact instead of pretty-printed output;
13
- -r, --raw-output output strings without escapes and quotes;
14
- --raw-output0 implies -r and output NUL after each output;
15
- -j, --join-output implies -r and output without newline after each output;
16
- -a, --ascii-output output strings by only ASCII characters using escape sequences;
17
- -S, --sort-keys sort keys of each object on output;
18
- -C, --color-output colorize JSON output;
19
- -M, --monochrome-output disable colored output;
20
- --tab use tabs for indentation;
21
- --indent n use n spaces for indentation (max 7 spaces);
22
- --unbuffered flush output stream after each output;
23
- --stream parse the input value in streaming fashion;
24
- --stream-errors implies --stream and report parse error as an array;
25
- --seq parse input/output as application/json-seq;
26
- -f, --from-file file load filter from the file;
27
- -L directory search modules from the directory;
28
- --arg name value set $name to the string value;
29
- --argjson name value set $name to the JSON value;
30
- --slurpfile name file set $name to an array of JSON values read from the file;
31
- --rawfile name file set $name to string contents of file;
32
- --args consume remaining arguments as positional string values;
33
- --jsonargs consume remaining arguments as positional JSON values;
34
- -e, --exit-status set exit status code based on the output;
35
- -V, --version show the version;
36
- --build-configuration show jq's build configuration;
37
- -h, --help show the help;
38
- -- terminates argument processing;
39
- """
40
- import argparse
41
- import contextlib
42
- import dataclasses as dc
43
- import io
44
- import os
45
- import subprocess
46
- import sys
47
- import typing as ta
48
-
49
- from .... import check
50
- from .... import fnpipes as fp
51
- from .... import lang
52
- from .formats import FORMATS_BY_NAME
53
- from .formats import Format
54
- from .formats import Formats
55
- from .parsing import DelimitingParser
56
- from .parsing import EagerParser
57
- from .parsing import StreamBuilder
58
- from .parsing import StreamParser
59
- from .processing import ProcessingOptions
60
- from .processing import Processor
61
- from .rendering import EagerRenderer
62
- from .rendering import RenderingOptions
63
- from .rendering import StreamRenderer
64
-
65
-
66
- T = ta.TypeVar('T')
67
- U = ta.TypeVar('U')
68
-
69
-
70
- def _build_args_parser() -> argparse.ArgumentParser:
71
- parser = argparse.ArgumentParser()
72
-
73
- parser.add_argument('file', nargs='?')
74
-
75
- parser.add_argument('--stream', action='store_true')
76
- parser.add_argument('--stream-build', action='store_true')
77
-
78
- parser.add_argument('-l', '--lines', action='store_true')
79
-
80
- parser.add_argument('--read-buffer-size', type=int, default=0x4000)
81
-
82
- parser.add_argument('-f', '--format')
83
-
84
- parser.add_argument('-x', '--jmespath-expr')
85
- parser.add_argument('-F', '--flat', action='store_true')
86
-
87
- parser.add_argument('-z', '--compact', action='store_true')
88
- parser.add_argument('-p', '--pretty', action='store_true')
89
- parser.add_argument('-i', '--indent')
90
- parser.add_argument('-s', '--sort-keys', action='store_true')
91
- parser.add_argument('-R', '--raw', action='store_true')
92
- parser.add_argument('-U', '--unicode', action='store_true')
93
- parser.add_argument('-c', '--color', action='store_true')
94
-
95
- parser.add_argument('-L', '--less', action='store_true')
96
-
97
- return parser
98
-
99
-
100
- def _parse_args(args: ta.Any = None) -> ta.Any:
101
- return _build_args_parser().parse_args(args)
102
-
103
-
104
- @dc.dataclass(frozen=True, kw_only=True)
105
- class RunConfiguration:
106
- format: Format
107
- processing: ProcessingOptions
108
- rendering: RenderingOptions
109
-
110
-
111
- def _process_args(args: ta.Any) -> RunConfiguration:
112
- fmt_name = args.format
113
- if fmt_name is None:
114
- if args.file is not None:
115
- ext = args.file.rpartition('.')[2]
116
- if ext in FORMATS_BY_NAME:
117
- fmt_name = ext
118
- if fmt_name is None:
119
- fmt_name = 'json'
120
- format = FORMATS_BY_NAME[fmt_name] # noqa
121
-
122
- if args.stream:
123
- check.arg(format is Formats.JSON.value)
124
-
125
- #
126
-
127
- processing = ProcessingOptions(
128
- jmespath_expr=args.jmespath_expr,
129
- flat=args.flat,
130
- )
131
-
132
- #
133
-
134
- separators = None
135
- if args.compact:
136
- separators = (',', ':')
137
-
138
- indent = None
139
- if args.pretty:
140
- indent = 2
141
- if args.indent:
142
- try:
143
- indent = int(args.indent)
144
- except ValueError:
145
- indent = args.indent
146
-
147
- rendering = RenderingOptions(
148
- indent=indent,
149
- separators=separators,
150
- sort_keys=args.sort_keys,
151
- raw=args.raw,
152
- unicode=args.unicode,
153
- color=args.color,
154
- )
155
-
156
- #
157
-
158
- return RunConfiguration(
159
- format=format,
160
- processing=processing,
161
- rendering=rendering,
162
- )
163
-
164
-
165
- def _main() -> None:
166
- args = _parse_args()
167
-
168
- #
169
-
170
- cfg = _process_args(args)
171
-
172
- #
173
-
174
- with contextlib.ExitStack() as es:
175
- if args.file is None:
176
- in_file = sys.stdin.buffer
177
-
178
- else:
179
- in_file = es.enter_context(open(args.file, 'rb'))
180
-
181
- def yield_input() -> ta.Generator[bytes, None, None]:
182
- fd = check.isinstance(in_file.fileno(), int)
183
-
184
- while True:
185
- buf = os.read(fd, args.read_buffer_size)
186
-
187
- yield buf
188
-
189
- if not buf:
190
- break
191
-
192
- #
193
-
194
- if args.less:
195
- less = subprocess.Popen(
196
- [
197
- 'less',
198
- *(['-R'] if cfg.rendering.color else []),
199
- ],
200
- stdin=subprocess.PIPE,
201
- encoding='utf-8',
202
- )
203
- out = check.not_none(less.stdin)
204
-
205
- def close_less() -> None:
206
- out.close()
207
- less.wait()
208
-
209
- es.enter_context(lang.defer(close_less)) # noqa
210
-
211
- else:
212
- out = sys.stdout
213
-
214
- #
215
-
216
- parser: ta.Any
217
- renderer: ta.Any
218
-
219
- if args.stream:
220
- with contextlib.ExitStack() as es2:
221
- parser = es2.enter_context(StreamParser())
222
-
223
- def flush_output(
224
- fn: ta.Callable[[T], ta.Iterable[U]],
225
- i: T,
226
- ) -> ta.Generator[U, None, None]:
227
- n = 0
228
- for o in fn(i):
229
- yield o
230
- n += 1
231
- if n:
232
- out.flush()
233
-
234
- pipeline: ta.Any
235
-
236
- if args.stream_build:
237
- builder: StreamBuilder = es2.enter_context(StreamBuilder())
238
- processor = Processor(cfg.processing)
239
- renderer = EagerRenderer(cfg.rendering)
240
- trailing_newline = False
241
-
242
- def append_newlines(
243
- fn: ta.Callable[[T], ta.Iterable[str]],
244
- i: T,
245
- ) -> ta.Generator[str, None, None]:
246
- yield from fn(i)
247
- yield '\n'
248
-
249
- pipeline = lambda v: (renderer.render(v),) # Any -> [str] # noqa
250
- pipeline = fp.bind(append_newlines, pipeline) # Any -> [str]
251
- pipeline = fp.bind(lang.flatmap, pipeline) # [Any] -> [str]
252
- pipeline = fp.pipe(fp.bind(lang.flatmap, processor.process), pipeline) # [Any] -> [str]
253
- pipeline = fp.pipe(fp.bind(lang.flatmap, builder.build), pipeline) # [JsonStreamParserEvent] -> [str] # noqa
254
- pipeline = fp.pipe(parser.parse, pipeline) # bytes -> [str]
255
-
256
- else:
257
- renderer = StreamRenderer(cfg.rendering)
258
- trailing_newline = True
259
-
260
- pipeline = renderer.render # JsonStreamParserEvent -> [str]
261
- pipeline = fp.bind(lang.flatmap, pipeline) # [JsonStreamParserEvent] -> [str]
262
- pipeline = fp.pipe(parser.parse, pipeline) # bytes -> [str]
263
-
264
- pipeline = fp.bind(flush_output, pipeline) # bytes -> [str]
265
-
266
- for buf in yield_input():
267
- for s in pipeline(buf):
268
- print(s, file=out, end='')
269
-
270
- if trailing_newline:
271
- print(file=out)
272
-
273
- elif args.lines:
274
- parser = DelimitingParser(cfg.format)
275
- processor = Processor(cfg.processing)
276
- renderer = EagerRenderer(cfg.rendering)
277
-
278
- for buf in yield_input():
279
- for v in parser.parse(buf):
280
- for e in processor.process(v):
281
- s = renderer.render(e)
282
- print(s, file=out)
283
-
284
- else:
285
- parser = EagerParser(cfg.format)
286
- processor = Processor(cfg.processing)
287
- renderer = EagerRenderer(cfg.rendering)
288
-
289
- with io.TextIOWrapper(in_file) as tf:
290
- v = parser.parse(tf)
291
-
292
- for e in processor.process(v):
293
- s = renderer.render(e)
294
- print(s, file=out)
295
-
296
-
297
- if __name__ == '__main__':
298
- _main()
@@ -1,71 +0,0 @@
1
- """
2
- TODO:
3
- - options lol - csv header, newline, etc
4
- """
5
- import dataclasses as dc
6
- import enum
7
- import json
8
- import typing as ta
9
-
10
- from .... import lang
11
-
12
-
13
- if ta.TYPE_CHECKING:
14
- import ast
15
- import csv
16
- import tomllib
17
-
18
- import yaml
19
-
20
- from ... import dotenv
21
- from ... import props
22
- from ... import xml
23
-
24
- else:
25
- ast = lang.proxy_import('ast')
26
- csv = lang.proxy_import('csv')
27
- tomllib = lang.proxy_import('tomllib')
28
-
29
- yaml = lang.proxy_import('yaml')
30
-
31
- dotenv = lang.proxy_import('...dotenv', __package__)
32
- props = lang.proxy_import('...props', __package__)
33
- xml = lang.proxy_import('...xml', __package__)
34
-
35
-
36
- ##
37
-
38
-
39
- @dc.dataclass(frozen=True)
40
- class Format:
41
- names: ta.Sequence[str]
42
- load: ta.Callable[[ta.TextIO], ta.Any]
43
-
44
-
45
- class Formats(enum.Enum):
46
- JSON = Format(['json'], json.load)
47
-
48
- YAML = Format(['yaml', 'yml'], lambda f: yaml.safe_load(f))
49
-
50
- TOML = Format(['toml'], lambda f: tomllib.loads(f.read()))
51
-
52
- ENV = Format(['env', 'dotenv'], lambda f: dotenv.dotenv_values(stream=f))
53
-
54
- PROPS = Format(['properties', 'props'], lambda f: dict(props.Properties().load(f.read())))
55
-
56
- PY = Format(['py', 'python', 'repr'], lambda f: ast.literal_eval(f.read()))
57
-
58
- XML = Format(['xml'], lambda f: xml.build_simple_element(xml.parse_tree(f.read()).getroot()).as_dict())
59
-
60
- CSV = Format(['csv'], lambda f: list(csv.DictReader(f)))
61
- TSV = Format(['tsv'], lambda f: list(csv.DictReader(f, delimiter='\t')))
62
- FLAT_CSV = Format(['fcsv'], lambda f: list(csv.reader(f)))
63
- FLAT_TSV = Format(['ftsv'], lambda f: list(csv.reader(f, delimiter='\t')))
64
-
65
-
66
- FORMATS_BY_NAME: ta.Mapping[str, Format] = {
67
- n: f
68
- for e in Formats
69
- for f in [e.value]
70
- for n in f.names
71
- }
@@ -1,74 +0,0 @@
1
- # """
2
- # TODO:
3
- # - -I/-Ogz, lz4, etc
4
- # - fnpairs? or not yet just do it
5
- # """
6
- # import abc
7
- # import contextlib
8
- # import dataclasses as dc
9
- # import gzip
10
- # import os
11
- # import typing as ta
12
- #
13
- # from .... import lang
14
- #
15
- #
16
- # if ta.TYPE_CHECKING:
17
- # import bz2 as _bz2
18
- # import gzip as _gzip
19
- # import lzma as _lzma
20
- # else:
21
- # _bz2 = lang.proxy_import('bz2')
22
- # _gzip = lang.proxy_import('gzip')
23
- # _lzma = lang.proxy_import('lzma')
24
- #
25
- #
26
- # ##
27
- #
28
- #
29
- # class BaseIo(lang.Abstract):
30
- # def close(self) -> None:
31
- # raise NotImplementedError
32
- #
33
- # def fileno(self) -> int | None:
34
- # return None
35
- #
36
- #
37
- # class Input(BaseIo):
38
- # @abc.abstractmethod
39
- # def read(self, sz: int | None = None) -> bytes:
40
- # raise NotImplementedError
41
- #
42
- #
43
- # class Output(BaseIo):
44
- # @abc.abstractmethod
45
- # def write(self, data: bytes) -> int:
46
- # raise NotImplementedError
47
- #
48
- #
49
- # #
50
- #
51
- #
52
- # DEFAULT_READ_SZ = 0x4000
53
- #
54
- #
55
- # @dc.dataclass(frozen=True)
56
- # class FdIo(Input, Output):
57
- # fd: int
58
- #
59
- # default_read_sz: int = DEFAULT_READ_SZ
60
- #
61
- # def read(self, sz: int | None = None) -> bytes:
62
- # return os.read(self.fd, sz or self.default_read_sz)
63
- #
64
- # def write(self, data: bytes) -> int:
65
- # return os.write(self.fd, data)
66
- #
67
- #
68
- # ##
69
- #
70
- #
71
- # @contextlib.contextmanager
72
- # def gzip_io_codec(f: ta.IO, mode: str) -> ta.ContextManager[ta.IO]:
73
- # with gzip.open(f, mode) as o:
74
- # yield o
@@ -1,82 +0,0 @@
1
- import codecs
2
- import io
3
- import typing as ta
4
-
5
- from .... import check
6
- from .... import lang
7
- from ....lite.io import DelimitingBuffer
8
- from ..stream.build import JsonObjectBuilder
9
- from ..stream.lex import JsonStreamLexer
10
- from ..stream.parse import JsonStreamParser
11
- from ..stream.parse import JsonStreamParserEvent
12
- from .formats import Format
13
-
14
-
15
- ##
16
-
17
-
18
- class EagerParser:
19
- def __init__(self, fmt: Format) -> None:
20
- super().__init__()
21
-
22
- self._fmt = fmt
23
-
24
- def parse(self, f: ta.TextIO) -> ta.Generator[ta.Any, None, None]:
25
- return self._fmt.load(f)
26
-
27
-
28
- ##
29
-
30
-
31
- class DelimitingParser:
32
- def __init__(
33
- self,
34
- fmt: Format,
35
- *,
36
- delimiters: ta.Iterable[int] = b'\n',
37
- ) -> None:
38
- super().__init__()
39
-
40
- self._fmt = fmt
41
-
42
- self._db = DelimitingBuffer(delimiters)
43
-
44
- def parse(self, b: bytes) -> ta.Generator[ta.Any, None, None]:
45
- for chunk in self._db.feed(b):
46
- s = check.isinstance(chunk, bytes).decode('utf-8')
47
- v = self._fmt.load(io.StringIO(s))
48
- yield v
49
-
50
-
51
- ##
52
-
53
-
54
- class StreamBuilder(lang.ExitStacked):
55
- _builder: JsonObjectBuilder | None = None
56
-
57
- def __enter__(self) -> ta.Self:
58
- super().__enter__()
59
- self._builder = self._enter_context(JsonObjectBuilder())
60
- return self
61
-
62
- def build(self, e: JsonStreamParserEvent) -> ta.Generator[ta.Any, None, None]:
63
- yield from check.not_none(self._builder)(e)
64
-
65
-
66
- class StreamParser(lang.ExitStacked):
67
- _decoder: codecs.IncrementalDecoder
68
- _lex: JsonStreamLexer
69
- _parse: JsonStreamParser
70
-
71
- def __enter__(self) -> ta.Self:
72
- super().__enter__()
73
- self._decoder = codecs.getincrementaldecoder('utf-8')()
74
- self._lex = self._enter_context(JsonStreamLexer())
75
- self._parse = self._enter_context(JsonStreamParser())
76
- return self
77
-
78
- def parse(self, b: bytes) -> ta.Generator[JsonStreamParserEvent, None, None]:
79
- for s in self._decoder.decode(b, not b):
80
- for c in s:
81
- for t in self._lex(c):
82
- yield from self._parse(t)
@@ -1,48 +0,0 @@
1
- import dataclasses as dc
2
- import typing as ta
3
-
4
- from .... import lang
5
-
6
-
7
- if ta.TYPE_CHECKING:
8
- from ....specs import jmespath
9
- else:
10
- jmespath = lang.proxy_import('....specs.jmespath', __package__)
11
-
12
-
13
- ##
14
-
15
-
16
- @dc.dataclass(frozen=True, kw_only=True)
17
- class ProcessingOptions:
18
- jmespath_expr: ta.Any | None = None
19
- flat: bool = False
20
-
21
-
22
- class Processor:
23
- def __init__(self, opts: ProcessingOptions) -> None:
24
- super().__init__()
25
-
26
- self._opts = opts
27
-
28
- jmespath_expr = opts.jmespath_expr
29
- if isinstance(jmespath_expr, str):
30
- jmespath_expr = jmespath.compile(jmespath_expr)
31
- self._jmespath_expr: ta.Any | None = jmespath_expr
32
-
33
- def process(self, v: ta.Any) -> ta.Iterable[ta.Any]:
34
- if self._jmespath_expr is not None:
35
- v = self._jmespath_expr.search(v)
36
-
37
- if self._opts.flat:
38
- if (
39
- not isinstance(v, ta.Iterable) or # noqa
40
- isinstance(v, ta.Mapping) or
41
- isinstance(v, lang.BUILTIN_SCALAR_ITERABLE_TYPES)
42
- ):
43
- raise TypeError(f'Flat output must be flat collections, got {type(v)}', v)
44
-
45
- yield from v
46
-
47
- else:
48
- yield v
@@ -1,92 +0,0 @@
1
- import dataclasses as dc
2
- import json
3
- import typing as ta
4
-
5
- from .... import lang
6
- from .... import term
7
- from ..render import JsonRenderer
8
- from ..stream.parse import JsonStreamParserEvent
9
- from ..stream.render import StreamJsonRenderer
10
-
11
-
12
- ##
13
-
14
-
15
- @dc.dataclass(frozen=True, kw_only=True)
16
- class RenderingOptions:
17
- indent: int | str | None = None
18
- separators: tuple[str, str] | None = None
19
- sort_keys: bool = False
20
- raw: bool = False
21
- unicode: bool = False
22
- color: bool = False
23
-
24
-
25
- def make_render_kwargs(opts: RenderingOptions) -> ta.Mapping[str, ta.Any]:
26
- return dict(
27
- indent=opts.indent,
28
- separators=opts.separators,
29
- sort_keys=opts.sort_keys,
30
- ensure_ascii=not opts.unicode,
31
- )
32
-
33
-
34
- class Renderer(lang.Abstract):
35
- def __init__(self, opts: RenderingOptions) -> None:
36
- super().__init__()
37
- self._opts = opts
38
- self._kw = make_render_kwargs(opts)
39
-
40
-
41
- ##
42
-
43
-
44
- def term_color(o: ta.Any, state: JsonRenderer.State) -> tuple[str, str]:
45
- if state is JsonRenderer.State.KEY:
46
- return term.SGR(term.SGRs.FG.BRIGHT_BLUE), term.SGR(term.SGRs.RESET)
47
- elif isinstance(o, str):
48
- return term.SGR(term.SGRs.FG.GREEN), term.SGR(term.SGRs.RESET)
49
- else:
50
- return '', ''
51
-
52
-
53
- ##
54
-
55
-
56
- class EagerRenderer(Renderer):
57
- def render(self, v: ta.Any) -> str:
58
- if self._opts.raw:
59
- if not isinstance(v, str):
60
- raise TypeError(f'Raw output must be strings, got {type(v)}', v)
61
-
62
- return v
63
-
64
- elif self._opts.color:
65
- return JsonRenderer.render_str(
66
- v,
67
- **self._kw,
68
- style=term_color,
69
- )
70
-
71
- else:
72
- return json.dumps(
73
- v,
74
- **self._kw,
75
- )
76
-
77
-
78
- ##
79
-
80
-
81
- class StreamRenderer(Renderer):
82
- def __init__(self, opts: RenderingOptions) -> None:
83
- super().__init__(opts)
84
-
85
- self._renderer = StreamJsonRenderer(
86
- style=term_color if self._opts.color else None,
87
- delimiter='\n',
88
- **self._kw,
89
- )
90
-
91
- def render(self, e: JsonStreamParserEvent) -> ta.Generator[str, None, None]:
92
- return self._renderer.render((e,))
File without changes
File without changes
File without changes