omlish 0.0.0.dev162__py3-none-any.whl → 0.0.0.dev164__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.
omlish/.manifests.json CHANGED
@@ -23,6 +23,234 @@
23
23
  }
24
24
  }
25
25
  },
26
+ {
27
+ "module": ".formats.cbor",
28
+ "attr": "_CBOR_LAZY_CODEC",
29
+ "file": "omlish/formats/cbor.py",
30
+ "line": 30,
31
+ "value": {
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.json.codecs",
42
+ "attr": "_JSON_LAZY_CODEC",
43
+ "file": "omlish/formats/json/codecs.py",
44
+ "line": 14,
45
+ "value": {
46
+ "$.codecs.base.LazyLoadedCodec": {
47
+ "mod_name": "omlish.formats.json.codecs",
48
+ "attr_name": "JSON_CODEC",
49
+ "name": "json",
50
+ "aliases": null
51
+ }
52
+ }
53
+ },
54
+ {
55
+ "module": ".formats.json.codecs",
56
+ "attr": "_JSON_COMPACT_LAZY_CODEC",
57
+ "file": "omlish/formats/json/codecs.py",
58
+ "line": 23,
59
+ "value": {
60
+ "$.codecs.base.LazyLoadedCodec": {
61
+ "mod_name": "omlish.formats.json.codecs",
62
+ "attr_name": "JSON_COMPACT_CODEC",
63
+ "name": "json-compact",
64
+ "aliases": null
65
+ }
66
+ }
67
+ },
68
+ {
69
+ "module": ".formats.json.codecs",
70
+ "attr": "_JSON_PRETTY_LAZY_CODEC",
71
+ "file": "omlish/formats/json/codecs.py",
72
+ "line": 32,
73
+ "value": {
74
+ "$.codecs.base.LazyLoadedCodec": {
75
+ "mod_name": "omlish.formats.json.codecs",
76
+ "attr_name": "JSON_PRETTY_CODEC",
77
+ "name": "json-pretty",
78
+ "aliases": null
79
+ }
80
+ }
81
+ },
82
+ {
83
+ "module": ".formats.json5",
84
+ "attr": "_JSON5_LAZY_CODEC",
85
+ "file": "omlish/formats/json5.py",
86
+ "line": 30,
87
+ "value": {
88
+ "$.codecs.base.LazyLoadedCodec": {
89
+ "mod_name": "omlish.formats.json5",
90
+ "attr_name": "JSON5_CODEC",
91
+ "name": "json5",
92
+ "aliases": null
93
+ }
94
+ }
95
+ },
96
+ {
97
+ "module": ".formats.pickle",
98
+ "attr": "_PICKLE_LAZY_CODEC",
99
+ "file": "omlish/formats/pickle.py",
100
+ "line": 30,
101
+ "value": {
102
+ "$.codecs.base.LazyLoadedCodec": {
103
+ "mod_name": "omlish.formats.pickle",
104
+ "attr_name": "PICKLE_CODEC",
105
+ "name": "pickle",
106
+ "aliases": null
107
+ }
108
+ }
109
+ },
110
+ {
111
+ "module": ".formats.toml",
112
+ "attr": "_TOML_LAZY_CODEC",
113
+ "file": "omlish/formats/toml.py",
114
+ "line": 16,
115
+ "value": {
116
+ "$.codecs.base.LazyLoadedCodec": {
117
+ "mod_name": "omlish.formats.toml",
118
+ "attr_name": "TOML_CODEC",
119
+ "name": "toml",
120
+ "aliases": null
121
+ }
122
+ }
123
+ },
124
+ {
125
+ "module": ".formats.yaml",
126
+ "attr": "_YAML_LAZY_CODEC",
127
+ "file": "omlish/formats/yaml.py",
128
+ "line": 258,
129
+ "value": {
130
+ "$.codecs.base.LazyLoadedCodec": {
131
+ "mod_name": "omlish.formats.yaml",
132
+ "attr_name": "YAML_CODEC",
133
+ "name": "yaml",
134
+ "aliases": [
135
+ "yml"
136
+ ]
137
+ }
138
+ }
139
+ },
140
+ {
141
+ "module": ".io.compress.brotli",
142
+ "attr": "_BROTLI_LAZY_CODEC",
143
+ "file": "omlish/io/compress/brotli.py",
144
+ "line": 46,
145
+ "value": {
146
+ "$.codecs.base.LazyLoadedCodec": {
147
+ "mod_name": "omlish.io.compress.brotli",
148
+ "attr_name": "BROTLI_CODEC",
149
+ "name": "brotli",
150
+ "aliases": null
151
+ }
152
+ }
153
+ },
154
+ {
155
+ "module": ".io.compress.bz2",
156
+ "attr": "_BZ2_LAZY_CODEC",
157
+ "file": "omlish/io/compress/bz2.py",
158
+ "line": 60,
159
+ "value": {
160
+ "$.codecs.base.LazyLoadedCodec": {
161
+ "mod_name": "omlish.io.compress.bz2",
162
+ "attr_name": "BZ2_CODEC",
163
+ "name": "bz2",
164
+ "aliases": null
165
+ }
166
+ }
167
+ },
168
+ {
169
+ "module": ".io.compress.gzip",
170
+ "attr": "_GZIP_LAZY_CODEC",
171
+ "file": "omlish/io/compress/gzip.py",
172
+ "line": 349,
173
+ "value": {
174
+ "$.codecs.base.LazyLoadedCodec": {
175
+ "mod_name": "omlish.io.compress.gzip",
176
+ "attr_name": "GZIP_CODEC",
177
+ "name": "gzip",
178
+ "aliases": [
179
+ "gz"
180
+ ]
181
+ }
182
+ }
183
+ },
184
+ {
185
+ "module": ".io.compress.lz4",
186
+ "attr": "_LZ4_LAZY_CODEC",
187
+ "file": "omlish/io/compress/lz4.py",
188
+ "line": 90,
189
+ "value": {
190
+ "$.codecs.base.LazyLoadedCodec": {
191
+ "mod_name": "omlish.io.compress.lz4",
192
+ "attr_name": "LZ4_CODEC",
193
+ "name": "lz4",
194
+ "aliases": null
195
+ }
196
+ }
197
+ },
198
+ {
199
+ "module": ".io.compress.lzma",
200
+ "attr": "_LZMA_LAZY_CODEC",
201
+ "file": "omlish/io/compress/lzma.py",
202
+ "line": 80,
203
+ "value": {
204
+ "$.codecs.base.LazyLoadedCodec": {
205
+ "mod_name": "omlish.io.compress.lzma",
206
+ "attr_name": "LZMA_CODEC",
207
+ "name": "lzma",
208
+ "aliases": null
209
+ }
210
+ }
211
+ },
212
+ {
213
+ "module": ".io.compress.snappy",
214
+ "attr": "_SNAPPY_LAZY_CODEC",
215
+ "file": "omlish/io/compress/snappy.py",
216
+ "line": 33,
217
+ "value": {
218
+ "$.codecs.base.LazyLoadedCodec": {
219
+ "mod_name": "omlish.io.compress.snappy",
220
+ "attr_name": "SNAPPY_CODEC",
221
+ "name": "snappy",
222
+ "aliases": null
223
+ }
224
+ }
225
+ },
226
+ {
227
+ "module": ".io.compress.zlib",
228
+ "attr": "_ZLIB_LAZY_CODEC",
229
+ "file": "omlish/io/compress/zlib.py",
230
+ "line": 73,
231
+ "value": {
232
+ "$.codecs.base.LazyLoadedCodec": {
233
+ "mod_name": "omlish.io.compress.zlib",
234
+ "attr_name": "ZLIB_CODEC",
235
+ "name": "zlib",
236
+ "aliases": null
237
+ }
238
+ }
239
+ },
240
+ {
241
+ "module": ".io.compress.zstd",
242
+ "attr": "_ZSTD_LAZY_CODEC",
243
+ "file": "omlish/io/compress/zstd.py",
244
+ "line": 43,
245
+ "value": {
246
+ "$.codecs.base.LazyLoadedCodec": {
247
+ "mod_name": "omlish.io.compress.zstd",
248
+ "attr_name": "ZSTD_CODEC",
249
+ "name": "zstd",
250
+ "aliases": null
251
+ }
252
+ }
253
+ },
26
254
  {
27
255
  "module": ".secrets.pwgen",
28
256
  "attr": "_CLI_MODULE",
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev162'
2
- __revision__ = 'd9129e1bcec87862768d3a2fc10011def8f3fd52'
1
+ __version__ = '0.0.0.dev164'
2
+ __revision__ = '72b4cfb1086b384ec55cc221069d5bb2be6b3c10'
3
3
 
4
4
 
5
5
  #
@@ -0,0 +1,69 @@
1
+ from .base import ( # noqa
2
+ EagerCodec,
3
+ IncrementalCodec,
4
+ ComboCodec,
5
+
6
+ check_codec_name,
7
+
8
+ Codec,
9
+
10
+ LazyLoadedCodec,
11
+ )
12
+
13
+ from .bytes import ( # noqa
14
+ ASCII85,
15
+ BASE16,
16
+ BASE32,
17
+ BASE64,
18
+ BASE85,
19
+ BASE32_HEX,
20
+ BASE64_HEX,
21
+ BASE64_URLSAFE,
22
+ HEX,
23
+ )
24
+
25
+ from .chain import ( # noqa
26
+ ChainEagerCodec,
27
+
28
+ chain,
29
+ )
30
+
31
+ from .funcs import ( # noqa
32
+ FnPairEagerCodec,
33
+ )
34
+
35
+ from .registry import ( # noqa
36
+ CodecRegistry,
37
+
38
+ REGISTRY,
39
+ register,
40
+ lookup,
41
+
42
+ encode,
43
+ decode,
44
+ )
45
+
46
+ from .standard import ( # noqa
47
+ STANDARD_CODECS,
48
+ )
49
+
50
+ from .text import ( # noqa
51
+ TextEncodingErrors,
52
+ TextEncodingOptions,
53
+
54
+ TextEncodingComboCodec,
55
+
56
+ TextEncodingCodec,
57
+
58
+ ASCII,
59
+ LATIN1,
60
+ UTF32,
61
+ UTF32BE,
62
+ UTF32LE,
63
+ UTF16,
64
+ UTF16BE,
65
+ UTF16LE,
66
+ UTF7,
67
+ UTF8,
68
+ UTF8SIG,
69
+ )
omlish/codecs/base.py ADDED
@@ -0,0 +1,102 @@
1
+ """
2
+ TODO:
3
+ - bytes-like - bytearray, memoryview
4
+ """
5
+ import abc
6
+ import typing as ta
7
+
8
+ from omlish import check
9
+ from omlish import dataclasses as dc
10
+ from omlish import lang
11
+ from omlish import reflect as rfl
12
+
13
+
14
+ I = ta.TypeVar('I')
15
+ O = ta.TypeVar('O')
16
+
17
+
18
+ ##
19
+
20
+
21
+ class EagerCodec(lang.Abstract, ta.Generic[I, O]):
22
+ @abc.abstractmethod
23
+ def encode(self, i: I) -> O:
24
+ raise NotImplementedError
25
+
26
+ @abc.abstractmethod
27
+ def decode(self, o: O) -> I:
28
+ raise NotImplementedError
29
+
30
+
31
+ class IncrementalCodec(lang.Abstract, ta.Generic[I, O]):
32
+ @abc.abstractmethod
33
+ def encode_incremental(self) -> ta.Generator[O | None, I, None]:
34
+ raise NotImplementedError
35
+
36
+ @abc.abstractmethod
37
+ def decode_incremental(self) -> ta.Generator[I | None, O, None]:
38
+ raise NotImplementedError
39
+
40
+
41
+ class ComboCodec( # noqa
42
+ EagerCodec[I, O],
43
+ IncrementalCodec[I, O],
44
+ lang.Abstract,
45
+ ta.Generic[I, O],
46
+ ):
47
+ pass
48
+
49
+
50
+ ##
51
+
52
+
53
+ def check_codec_name(s: str) -> str:
54
+ check.non_empty_str(s)
55
+ check.not_in('_', s)
56
+ check.equal(s.strip(), s)
57
+ return s
58
+
59
+
60
+ ##
61
+
62
+
63
+ @dc.dataclass(frozen=True, kw_only=True)
64
+ class Codec:
65
+ name: str = dc.xfield(coerce=check_codec_name)
66
+ aliases: ta.Collection[str] | None = dc.xfield(
67
+ default=None,
68
+ coerce=lang.opt_fn(lambda s: [check_codec_name(a) for a in s]), # type: ignore
69
+ )
70
+
71
+ input: rfl.Type = dc.xfield(coerce=rfl.type_)
72
+ output: rfl.Type = dc.xfield(coerce=rfl.type_)
73
+
74
+ options: type | None = None
75
+
76
+ new: ta.Callable[..., EagerCodec]
77
+ new_incremental: ta.Callable[..., IncrementalCodec] | None = None
78
+
79
+
80
+ ##
81
+
82
+
83
+ @dc.dataclass(frozen=True, kw_only=True)
84
+ class LazyLoadedCodec:
85
+ mod_name: str
86
+ attr_name: str
87
+ name: str
88
+ aliases: ta.Collection[str] | None = None
89
+
90
+ @classmethod
91
+ def new(
92
+ cls,
93
+ mod_name: str,
94
+ attr_name: str,
95
+ codec: Codec,
96
+ ) -> 'LazyLoadedCodec':
97
+ return cls(
98
+ mod_name=mod_name,
99
+ attr_name=attr_name,
100
+ name=codec.name,
101
+ aliases=codec.aliases,
102
+ )
omlish/codecs/bytes.py ADDED
@@ -0,0 +1,119 @@
1
+ """
2
+ TODO:
3
+ - options / kwargs
4
+ """
5
+ import base64
6
+ import binascii
7
+ import typing as ta
8
+
9
+ from .. import check
10
+ from .base import Codec
11
+ from .funcs import FnPairEagerCodec
12
+ from .standard import STANDARD_CODECS
13
+
14
+
15
+ ##
16
+
17
+
18
+ class BytesCodec(Codec):
19
+ pass
20
+
21
+
22
+ def make_bytes_encoding_codec(
23
+ name: str,
24
+ aliases: ta.Collection[str] | None,
25
+ encode: ta.Callable[[bytes], bytes],
26
+ decode: ta.Callable[[bytes], bytes],
27
+ *,
28
+ append_to: ta.MutableSequence[Codec] | None = None,
29
+ ) -> BytesCodec:
30
+ codec = BytesCodec(
31
+ name=name,
32
+ aliases=check.not_isinstance(aliases, str),
33
+
34
+ input=bytes,
35
+ output=bytes,
36
+
37
+ new=lambda: FnPairEagerCodec.of(encode, decode),
38
+ )
39
+
40
+ if append_to is not None:
41
+ append_to.append(codec)
42
+
43
+ return codec
44
+
45
+
46
+ ##
47
+
48
+
49
+ ASCII85 = make_bytes_encoding_codec(
50
+ 'ascii85',
51
+ ['a85'],
52
+ base64.a85encode,
53
+ base64.a85decode,
54
+ append_to=STANDARD_CODECS,
55
+ )
56
+
57
+ BASE16 = make_bytes_encoding_codec(
58
+ 'base16',
59
+ ['b16'],
60
+ base64.b16encode,
61
+ base64.b16decode,
62
+ append_to=STANDARD_CODECS,
63
+ )
64
+
65
+ BASE32 = make_bytes_encoding_codec(
66
+ 'base32',
67
+ ['b32'],
68
+ base64.b32encode,
69
+ base64.b32decode,
70
+ append_to=STANDARD_CODECS,
71
+ )
72
+
73
+ BASE64 = make_bytes_encoding_codec(
74
+ 'base64',
75
+ ['b64'],
76
+ base64.b64encode,
77
+ base64.b64decode,
78
+ append_to=STANDARD_CODECS,
79
+ )
80
+
81
+ BASE85 = make_bytes_encoding_codec(
82
+ 'base85',
83
+ ['b85'],
84
+ base64.b85encode,
85
+ base64.b85decode,
86
+ append_to=STANDARD_CODECS,
87
+ )
88
+
89
+ BASE32_HEX = make_bytes_encoding_codec(
90
+ 'base32-hex',
91
+ ['b32-hex'],
92
+ base64.b32hexencode,
93
+ base64.b32hexdecode,
94
+ append_to=STANDARD_CODECS,
95
+ )
96
+
97
+ BASE64_HEX = make_bytes_encoding_codec(
98
+ 'base64-hex',
99
+ ['b64-hex'],
100
+ base64.standard_b64encode,
101
+ base64.standard_b64decode,
102
+ append_to=STANDARD_CODECS,
103
+ )
104
+
105
+ BASE64_URLSAFE = make_bytes_encoding_codec(
106
+ 'base64-urlsafe',
107
+ ['b64-urlsafe'],
108
+ base64.urlsafe_b64encode,
109
+ base64.urlsafe_b64decode,
110
+ append_to=STANDARD_CODECS,
111
+ )
112
+
113
+ HEX = make_bytes_encoding_codec(
114
+ 'hex',
115
+ [],
116
+ binascii.b2a_hex,
117
+ binascii.a2b_hex,
118
+ append_to=STANDARD_CODECS,
119
+ )
omlish/codecs/chain.py ADDED
@@ -0,0 +1,23 @@
1
+ import dataclasses as dc
2
+ import typing as ta
3
+
4
+ from .base import EagerCodec
5
+
6
+
7
+ @dc.dataclass(frozen=True)
8
+ class ChainEagerCodec(EagerCodec[ta.Any, ta.Any]):
9
+ codecs: ta.Sequence[EagerCodec]
10
+
11
+ def encode(self, v: ta.Any) -> ta.Any:
12
+ for c in self.codecs:
13
+ v = c.encode(v)
14
+ return v
15
+
16
+ def decode(self, v: ta.Any) -> ta.Any:
17
+ for c in reversed(self.codecs):
18
+ v = c.decode(v)
19
+ return v
20
+
21
+
22
+ def chain(*codecs: EagerCodec) -> ChainEagerCodec:
23
+ return ChainEagerCodec(codecs)
omlish/codecs/funcs.py ADDED
@@ -0,0 +1,28 @@
1
+ import dataclasses as dc
2
+ import typing as ta
3
+
4
+ from ..funcs import pairs as fps
5
+ from .base import EagerCodec
6
+
7
+
8
+ I = ta.TypeVar('I')
9
+ O = ta.TypeVar('O')
10
+
11
+
12
+ @dc.dataclass(frozen=True)
13
+ class FnPairEagerCodec(EagerCodec[I, O]):
14
+ fp: fps.FnPair[I, O]
15
+
16
+ def encode(self, i: I) -> O:
17
+ return self.fp.forward(i)
18
+
19
+ def decode(self, o: O) -> I:
20
+ return self.fp.backward(o)
21
+
22
+ @classmethod
23
+ def of(
24
+ cls,
25
+ encode: ta.Callable[[I], O],
26
+ decode: ta.Callable[[O], I],
27
+ ) -> 'FnPairEagerCodec[I, O]':
28
+ return cls(fps.of(encode, decode))