omlish 0.0.0.dev192__py3-none-any.whl → 0.0.0.dev194__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 (34) hide show
  1. omlish/.manifests.json +17 -3
  2. omlish/__about__.py +2 -2
  3. omlish/codecs/base.py +2 -0
  4. omlish/configs/__init__.py +0 -5
  5. omlish/configs/formats.py +247 -0
  6. omlish/configs/nginx.py +72 -0
  7. omlish/configs/processing/__init__.py +0 -0
  8. omlish/configs/{flattening.py → processing/flattening.py} +31 -33
  9. omlish/configs/processing/inheritance.py +58 -0
  10. omlish/configs/processing/matching.py +53 -0
  11. omlish/configs/processing/names.py +50 -0
  12. omlish/configs/processing/rewriting.py +141 -0
  13. omlish/configs/processing/strings.py +45 -0
  14. omlish/configs/types.py +9 -0
  15. omlish/formats/__init__.py +4 -0
  16. omlish/formats/ini/__init__.py +0 -0
  17. omlish/formats/ini/codec.py +26 -0
  18. omlish/formats/ini/sections.py +45 -0
  19. omlish/formats/toml/__init__.py +0 -0
  20. omlish/formats/{toml.py → toml/codec.py} +2 -2
  21. omlish/formats/toml/parser.py +827 -0
  22. omlish/formats/toml/writer.py +124 -0
  23. omlish/lang/__init__.py +4 -1
  24. omlish/lang/iterables.py +0 -7
  25. omlish/lite/configs.py +38 -0
  26. omlish/lite/types.py +9 -0
  27. omlish/text/glyphsplit.py +25 -10
  28. {omlish-0.0.0.dev192.dist-info → omlish-0.0.0.dev194.dist-info}/METADATA +1 -1
  29. {omlish-0.0.0.dev192.dist-info → omlish-0.0.0.dev194.dist-info}/RECORD +33 -17
  30. omlish/configs/strings.py +0 -96
  31. {omlish-0.0.0.dev192.dist-info → omlish-0.0.0.dev194.dist-info}/LICENSE +0 -0
  32. {omlish-0.0.0.dev192.dist-info → omlish-0.0.0.dev194.dist-info}/WHEEL +0 -0
  33. {omlish-0.0.0.dev192.dist-info → omlish-0.0.0.dev194.dist-info}/entry_points.txt +0 -0
  34. {omlish-0.0.0.dev192.dist-info → omlish-0.0.0.dev194.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,124 @@
1
+ # @omlish-lite
2
+ import dataclasses as dc
3
+ import io
4
+ import string
5
+ import typing as ta
6
+
7
+
8
+ class TomlWriter:
9
+ @dc.dataclass(frozen=True)
10
+ class Literal:
11
+ s: str
12
+
13
+ def __init__(self, out: ta.TextIO) -> None:
14
+ super().__init__()
15
+ self._out = out
16
+
17
+ self._indent = 0
18
+ self._wrote_indent = False
19
+
20
+ #
21
+
22
+ def _w(self, s: str) -> None:
23
+ if not self._wrote_indent:
24
+ self._out.write(' ' * self._indent)
25
+ self._wrote_indent = True
26
+ self._out.write(s)
27
+
28
+ def _nl(self) -> None:
29
+ self._out.write('\n')
30
+ self._wrote_indent = False
31
+
32
+ def _needs_quote(self, s: str) -> bool:
33
+ return (
34
+ not s or
35
+ any(c in s for c in '\'"\n') or
36
+ s[0] not in string.ascii_letters
37
+ )
38
+
39
+ def _maybe_quote(self, s: str) -> str:
40
+ if self._needs_quote(s):
41
+ return repr(s)
42
+ else:
43
+ return s
44
+
45
+ #
46
+
47
+ def write_root(self, obj: ta.Mapping) -> None:
48
+ for i, (k, v) in enumerate(obj.items()):
49
+ if i:
50
+ self._nl()
51
+ self._w('[')
52
+ self._w(self._maybe_quote(k))
53
+ self._w(']')
54
+ self._nl()
55
+ self.write_table_contents(v)
56
+
57
+ def write_table_contents(self, obj: ta.Mapping) -> None:
58
+ for k, v in obj.items():
59
+ self.write_key(k)
60
+ self._w(' = ')
61
+ self.write_value(v)
62
+ self._nl()
63
+
64
+ def write_array(self, obj: ta.Sequence) -> None:
65
+ self._w('[')
66
+ self._nl()
67
+ self._indent += 1
68
+ for e in obj:
69
+ self.write_value(e)
70
+ self._w(',')
71
+ self._nl()
72
+ self._indent -= 1
73
+ self._w(']')
74
+
75
+ def write_inline_table(self, obj: ta.Mapping) -> None:
76
+ self._w('{')
77
+ for i, (k, v) in enumerate(obj.items()):
78
+ if i:
79
+ self._w(', ')
80
+ self.write_key(k)
81
+ self._w(' = ')
82
+ self.write_value(v)
83
+ self._w('}')
84
+
85
+ def write_inline_array(self, obj: ta.Sequence) -> None:
86
+ self._w('[')
87
+ for i, e in enumerate(obj):
88
+ if i:
89
+ self._w(', ')
90
+ self.write_value(e)
91
+ self._w(']')
92
+
93
+ def write_key(self, obj: ta.Any) -> None:
94
+ if isinstance(obj, TomlWriter.Literal):
95
+ self._w(obj.s)
96
+ elif isinstance(obj, str):
97
+ self._w(self._maybe_quote(obj.replace('_', '-')))
98
+ elif isinstance(obj, int):
99
+ self._w(repr(str(obj)))
100
+ else:
101
+ raise TypeError(obj)
102
+
103
+ def write_value(self, obj: ta.Any) -> None:
104
+ if isinstance(obj, bool):
105
+ self._w(str(obj).lower())
106
+ elif isinstance(obj, (str, int, float)):
107
+ self._w(repr(obj))
108
+ elif isinstance(obj, ta.Mapping):
109
+ self.write_inline_table(obj)
110
+ elif isinstance(obj, ta.Sequence):
111
+ if not obj:
112
+ self.write_inline_array(obj)
113
+ else:
114
+ self.write_array(obj)
115
+ else:
116
+ raise TypeError(obj)
117
+
118
+ #
119
+
120
+ @classmethod
121
+ def write_str(cls, obj: ta.Any) -> str:
122
+ out = io.StringIO()
123
+ cls(out).write_value(obj)
124
+ return out.getvalue()
omlish/lang/__init__.py CHANGED
@@ -147,7 +147,6 @@ from .imports import ( # noqa
147
147
  )
148
148
 
149
149
  from .iterables import ( # noqa
150
- BUILTIN_SCALAR_ITERABLE_TYPES,
151
150
  asrange,
152
151
  exhaust,
153
152
  flatmap,
@@ -238,6 +237,10 @@ from .typing import ( # noqa
238
237
 
239
238
  ##
240
239
 
240
+ from ..lite.types import ( # noqa
241
+ BUILTIN_SCALAR_ITERABLE_TYPES,
242
+ )
243
+
241
244
  from ..lite.typing import ( # noqa
242
245
  AnyFunc,
243
246
  Func0,
omlish/lang/iterables.py CHANGED
@@ -8,13 +8,6 @@ T = ta.TypeVar('T')
8
8
  R = ta.TypeVar('R')
9
9
 
10
10
 
11
- BUILTIN_SCALAR_ITERABLE_TYPES: tuple[type, ...] = (
12
- bytearray,
13
- bytes,
14
- str,
15
- )
16
-
17
-
18
11
  ##
19
12
 
20
13
 
omlish/lite/configs.py ADDED
@@ -0,0 +1,38 @@
1
+ # ruff: noqa: UP006 UP007
2
+ import typing as ta
3
+
4
+ from ..configs.formats import DEFAULT_CONFIG_FILE_LOADER
5
+ from ..configs.types import ConfigMap
6
+ from .marshal import OBJ_MARSHALER_MANAGER
7
+ from .marshal import ObjMarshalerManager
8
+
9
+
10
+ T = ta.TypeVar('T')
11
+
12
+
13
+ ##
14
+
15
+
16
+ def load_config_file_obj(
17
+ f: str,
18
+ cls: ta.Type[T],
19
+ *,
20
+ prepare: ta.Union[
21
+ ta.Callable[[ConfigMap], ConfigMap],
22
+ ta.Iterable[ta.Callable[[ConfigMap], ConfigMap]],
23
+ ] = (),
24
+ msh: ObjMarshalerManager = OBJ_MARSHALER_MANAGER,
25
+ ) -> T:
26
+ config_data = DEFAULT_CONFIG_FILE_LOADER.load_file(f)
27
+
28
+ config_dct = config_data.as_map()
29
+
30
+ if prepare is not None:
31
+ if isinstance(prepare, ta.Iterable):
32
+ pfs = list(prepare)
33
+ else:
34
+ pfs = [prepare]
35
+ for pf in pfs:
36
+ config_dct = pf(config_dct)
37
+
38
+ return msh.unmarshal_obj(config_dct, cls)
omlish/lite/types.py ADDED
@@ -0,0 +1,9 @@
1
+ # ruff: noqa: UP006 UP007
2
+ import typing as ta
3
+
4
+
5
+ BUILTIN_SCALAR_ITERABLE_TYPES: ta.Tuple[type, ...] = (
6
+ bytearray,
7
+ bytes,
8
+ str,
9
+ )
omlish/text/glyphsplit.py CHANGED
@@ -1,3 +1,5 @@
1
+ # ruff: noqa: UP006 UP007
2
+ # @omlish-lite
1
3
  """
2
4
  Note: string.Formatter (and string.Template) shouldn't be ignored - if they can be used they probably should be.
3
5
  - https://docs.python.org/3/library/string.html#custom-string-formatting
@@ -5,22 +7,22 @@ Note: string.Formatter (and string.Template) shouldn't be ignored - if they can
5
7
  """
6
8
  import dataclasses as dc
7
9
  import re
10
+ import typing as ta
8
11
 
9
- from .. import check
12
+ from ..lite.check import check
10
13
 
11
14
 
12
15
  @dc.dataclass(frozen=True)
13
- class GlyphMatch:
16
+ class GlyphSplitMatch:
14
17
  l: str
15
18
  s: str
16
19
  r: str
17
20
 
18
21
 
19
22
  class GlyphSplitter:
20
-
21
23
  def __init__(
22
24
  self,
23
- glyphs: tuple[str, str],
25
+ glyphs: ta.Tuple[str, str],
24
26
  *,
25
27
  escape_returned_doubles: bool = False,
26
28
  compact: bool = False,
@@ -49,7 +51,7 @@ class GlyphSplitter:
49
51
 
50
52
  self._single_glyph_pat = re.compile(r'(%s[^%s]*?%s)' % (self._l_escaped_glyph, self._r_escaped_glyph, self._r_escaped_glyph)) # noqa
51
53
 
52
- def split(self, s: str) -> list[GlyphMatch | str]:
54
+ def split(self, s: str) -> ta.List[ta.Union[GlyphSplitMatch, str]]:
53
55
  ps = self._l_glyph_pat.split(s)
54
56
  ps = [p[::-1] for p in ps for p in reversed(self._r_glyph_pat.split(p[::-1]))]
55
57
 
@@ -77,7 +79,7 @@ class GlyphSplitter:
77
79
  for m in ms:
78
80
  if m.start() != l:
79
81
  append_ret(p[l:m.start()])
80
- append_ret(GlyphMatch(self._l_glyph, p[m.start() + 1:m.end() - 1], self._r_glyph))
82
+ append_ret(GlyphSplitMatch(self._l_glyph, p[m.start() + 1:m.end() - 1], self._r_glyph))
81
83
  l = m.end()
82
84
 
83
85
  if l < len(p):
@@ -91,7 +93,20 @@ _BRACE_GLYPH_SPLITTER = GlyphSplitter(('{', '}'), escape_returned_doubles=True,
91
93
  _BRACKET_GLYPH_SPLITTER = GlyphSplitter(('[', ']'), escape_returned_doubles=True, compact=True)
92
94
  _ANGLE_BRACKET_GLYPH_SPLITTER = GlyphSplitter(('<', '>'), escape_returned_doubles=True, compact=True)
93
95
 
94
- split_parens = _PAREN_GLYPH_SPLITTER.split
95
- split_braces = _BRACE_GLYPH_SPLITTER.split
96
- split_brackets = _BRACKET_GLYPH_SPLITTER.split
97
- split_angle_brackets = _ANGLE_BRACKET_GLYPH_SPLITTER.split
96
+ glyph_split_parens = _PAREN_GLYPH_SPLITTER.split
97
+ glyph_split_braces = _BRACE_GLYPH_SPLITTER.split
98
+ glyph_split_brackets = _BRACKET_GLYPH_SPLITTER.split
99
+ glyph_split_angle_brackets = _ANGLE_BRACKET_GLYPH_SPLITTER.split
100
+
101
+
102
+ def glyph_split_interpolate(
103
+ split_fn: ta.Callable[[str], ta.Sequence[ta.Union[GlyphSplitMatch, str]]],
104
+ dct: ta.Mapping[str, str],
105
+ s: str,
106
+ ) -> str:
107
+ if not s:
108
+ return s
109
+ sps = split_fn(s)
110
+ if len(sps) == 1 and isinstance(sps[0], str):
111
+ return sps[0]
112
+ return ''.join(dct[p.s] if isinstance(p, GlyphSplitMatch) else p for p in sps)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev192
3
+ Version: 0.0.0.dev194
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
- omlish/.manifests.json,sha256=lRkBDFxlAbf6lN5upo3WSf-owW8YG1T21dfpbQL-XHM,7598
2
- omlish/__about__.py,sha256=oo7sJmjafPT0cBR9y7sAaWC5KC5PrDsDJ8LZwWkLu34,3409
1
+ omlish/.manifests.json,sha256=dyIpveH7Z8OnQp2pTn6NVv7LCDXVrozJWAzbk8PBavg,7950
2
+ omlish/__about__.py,sha256=EGlq5fZGiyJg2x9ba9tOUhbLf6OjV9lr0mNkhwX1DnU,3409
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=ubu7lHwss5V4UznbejAI0qXhXahrU01MysuHOZI9C4U,8116
5
5
  omlish/cached.py,sha256=UI-XTFBwA6YXWJJJeBn-WkwBkfzDjLBBaZf4nIJA9y0,510
@@ -117,7 +117,7 @@ omlish/bootstrap/main.py,sha256=yZhOHDDlj4xB5a89dRdT8z58FsqqnpoBg1-tvY2CJe4,5903
117
117
  omlish/bootstrap/marshal.py,sha256=ZxdAeMNd2qXRZ1HUK89HmEhz8tqlS9OduW34QBscKw0,516
118
118
  omlish/bootstrap/sys.py,sha256=aqMzxZa_lPj78cgz4guYZAkjT6En32e2LptfEo20NIM,8769
119
119
  omlish/codecs/__init__.py,sha256=-FDwRJFGagg-fZyQ8wup4GPuR6gHpmaChzthlykn-kY,876
120
- omlish/codecs/base.py,sha256=O6MDkBg0LDq3W-bVXpNEZiIkTYQo2cwaHFoUwxgtcOk,2208
120
+ omlish/codecs/base.py,sha256=JXTFSLnX5qPbi4NSbbI5uB3tYhs2SN0g_eWN2UskPYE,2242
121
121
  omlish/codecs/bytes.py,sha256=jlZ87OmZ52HhQDNyL87R3OIviK2qV5iU2jZYOTOLWjk,2157
122
122
  omlish/codecs/chain.py,sha256=DrBi5vbaFfObfoppo6alwOmyW2XbrH2051cjExwr2Gs,527
123
123
  omlish/codecs/funcs.py,sha256=p4imNt7TobyZVXWC-WhntHVu9KfJrO4QwdtPRh-cVOk,850
@@ -149,10 +149,18 @@ omlish/concurrent/__init__.py,sha256=9p-s8MvBEYDqHIoYU3OYoe-Nni22QdkW7nhZGEukJTM
149
149
  omlish/concurrent/executors.py,sha256=FYKCDYYuj-OgMa8quLsA47SfFNX3KDJvRENVk8NDsrA,1292
150
150
  omlish/concurrent/futures.py,sha256=J2s9wYURUskqRJiBbAR0PNEAp1pXbIMYldOVBTQduQY,4239
151
151
  omlish/concurrent/threadlets.py,sha256=JfirbTDJgy9Ouokz_VmHeAAPS7cih8qMUJrN-owwXD4,2423
152
- omlish/configs/__init__.py,sha256=3uh09ezodTwkMI0nRmAMP0eEuJ_0VdF-LYyNmPjHiCE,77
152
+ omlish/configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
153
153
  omlish/configs/classes.py,sha256=GLbB8xKjHjjoUQRCUQm3nEjM8z1qNTx9gPV7ODSt5dg,1317
154
- omlish/configs/flattening.py,sha256=rVxoTqgM9te86hUwQsHJ5u94jo2PARNfhk_HkrrDT9Y,4745
155
- omlish/configs/strings.py,sha256=0brx1duL85r1GpfbNvbHcSvH4jWzutwuvMFXda9NeI0,2651
154
+ omlish/configs/formats.py,sha256=RJw4Rzp7vlTd5YyAvpAoruQnk45v8dGPtPWwqH7aYyE,5301
155
+ omlish/configs/nginx.py,sha256=XuX9yyb0_MwkJ8esKiMS9gFkqHUPza_uCprhnWykNy8,2051
156
+ omlish/configs/types.py,sha256=t5_32MVRSKxbxor1hl1wRGKYm75F6Atisd_RYsN5ELU,103
157
+ omlish/configs/processing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
158
+ omlish/configs/processing/flattening.py,sha256=1duZH5zbrGuoYqaJco5LN5qx6e76QP5pHbIyItkQsFY,5021
159
+ omlish/configs/processing/inheritance.py,sha256=lFD8eWRE0cG0Z3-eCu7pMsP2skWhUNaoAtWi9fNfn8k,1218
160
+ omlish/configs/processing/matching.py,sha256=JMS9r58pMCBbpewOhPY5oPtBu3uD6z6YBfZq4jnLwBE,1236
161
+ omlish/configs/processing/names.py,sha256=weHmaTclzgM9lUn3aBtw-kwZ3mc2N-CZlFg3Kd_UsKo,1093
162
+ omlish/configs/processing/rewriting.py,sha256=v7PfHtuTn5v_5Y6Au7oMN2Z0nxAMy1iYyO5CXnTvZhs,4226
163
+ omlish/configs/processing/strings.py,sha256=qFS2oh6z02IaM_q4lTKLdufzkJqAJ6J-Qjrz5S-QJoM,826
156
164
  omlish/dataclasses/__init__.py,sha256=AHo-tN5V_b_VYFUF7VFRmuHrjZBXS1WytRAj061MUTA,1423
157
165
  omlish/dataclasses/utils.py,sha256=lcikCPiiX5Giu0Kb1hP18loZjmm_Z9D-XtJ-ZlHq9iM,3793
158
166
  omlish/dataclasses/impl/LICENSE,sha256=Oy-B_iHRgcSZxZolbI4ZaEVdZonSaaqFNzv7avQdo78,13936
@@ -209,7 +217,7 @@ omlish/docker/detect.py,sha256=Qrdbosm2wJkxKDuy8gaGmbQoxk4Wnp1HJjAEz58NA8Y,614
209
217
  omlish/docker/hub.py,sha256=7LIuJGdA-N1Y1dmo50ynKM1KUTcnQM_5XbtPbdT_QLU,3940
210
218
  omlish/docker/manifests.py,sha256=LR4FpOGNUT3bZQ-gTjB6r_-1C3YiG30QvevZjrsVUQM,7068
211
219
  omlish/docker/timebomb.py,sha256=A_pgIDaXKsQwPiikrCTgIJl91gwYqkPGFY6j-Naq07Q,342
212
- omlish/formats/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
220
+ omlish/formats/__init__.py,sha256=T0AG1gFnqQ5JiHN0UPQjQ-7g5tnxMIG-mgOvMYExYAM,21
213
221
  omlish/formats/cbor.py,sha256=o_Hbe4kthO9CeXK-FySrw0dHVlrdyTo2Y8PpGRDfZ3c,514
214
222
  omlish/formats/cloudpickle.py,sha256=16si4yUp_pAdDWGECAWf6HLA2PwSANGGgDoMLGZUem8,579
215
223
  omlish/formats/codecs.py,sha256=6AbKIz_gl_om36-7qsutybYzK8cJP3LzwC9YJlwCPOA,1590
@@ -218,9 +226,11 @@ omlish/formats/json5.py,sha256=odpZIShlUpv19aACWe58SoMPcv0AHKIa6zSMjlKgaMI,515
218
226
  omlish/formats/pickle.py,sha256=jdp4E9WH9qVPBE3sSqbqDtUo18RbTSIiSpSzJ-IEVZw,529
219
227
  omlish/formats/props.py,sha256=cek3JLFLIrpE76gvs8rs_B8yF4SpY8ooDH8apWsquwE,18953
220
228
  omlish/formats/repr.py,sha256=kYrNs4o-ji8nOdp6u_L3aMgBMWN1ZAZJSAWgQQfStSQ,414
221
- omlish/formats/toml.py,sha256=AhpVNAy87eBohBCsvIvwH2ucASWxnWXMEsMH8zB7rpI,340
222
229
  omlish/formats/xml.py,sha256=ggiOwSERt4d9XmZwLZiDIh5qnFJS4jdmow9m9_9USps,1491
223
230
  omlish/formats/yaml.py,sha256=ffOwGnLA6chdiFyaS7X0TBMGmHG9AoGudzKVWfQ1UOs,7389
231
+ omlish/formats/ini/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
232
+ omlish/formats/ini/codec.py,sha256=omuFg0kiDksv8rRlWd_v32ebzEcKlgmiPgGID3bRi2M,631
233
+ omlish/formats/ini/sections.py,sha256=7wYyZdVTQbMPFpjQEACKJfAEPzUBrogINsrvFgxJoZ0,1015
224
234
  omlish/formats/json/__init__.py,sha256=y7T-Jm-7FuQFzb-6uedky0ZhBaKtCKzcu291juXfiWI,669
225
235
  omlish/formats/json/codecs.py,sha256=E5KErfqsgGZq763ixXLT3qysbk5MIsypT92xG5aSaIs,796
226
236
  omlish/formats/json/consts.py,sha256=A0cTAGGLyjo-gcYIQrL4JIaardI0yPMhQoNmh42BaRg,387
@@ -243,6 +253,10 @@ omlish/formats/json/stream/errors.py,sha256=c8M8UAYmIZ-vWZLeKD2jMj4EDCJbr9QR8Jq_
243
253
  omlish/formats/json/stream/lex.py,sha256=bfy0fb3_Z6G18UGueX2DR6oPSVUsMoFhlbsvXC3ztzI,6793
244
254
  omlish/formats/json/stream/parse.py,sha256=JuYmXwtTHmQJTFKoJNoEHUpCPxXdl_gvKPykVXgED34,6208
245
255
  omlish/formats/json/stream/render.py,sha256=NtmDsN92xZi5dkgSSuMeMXMAiJblmjz1arB4Ft7vBhc,3715
256
+ omlish/formats/toml/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
257
+ omlish/formats/toml/codec.py,sha256=5HFGWEPd9IFxPlRMRheX8FEDlRIzLe1moHEOj2_PFKU,342
258
+ omlish/formats/toml/parser.py,sha256=3QN3rqdJ_zlHfFtsDn-A9pl-BTwdVMUUpUV5-lGWCKc,29342
259
+ omlish/formats/toml/writer.py,sha256=HIp6XvriXaPTLqyLe-fkIiEf1Pyhsp0TcOg5rFBpO3g,3226
246
260
  omlish/funcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
247
261
  omlish/funcs/genmachine.py,sha256=EY2k-IFNKMEmHo9CmGRptFvhEMZVOWzZhn0wdQGeaFM,2476
248
262
  omlish/funcs/match.py,sha256=gMLZn1enNiFvQaWrQubY300M1BrmdKWzeePihBS7Ywc,6153
@@ -341,7 +355,7 @@ omlish/iterators/iterators.py,sha256=ghI4dO6WPyyFOLTIIMaHQ_IOy2xXaFpGPqveZ5YGIBU
341
355
  omlish/iterators/recipes.py,sha256=53mkexitMhkwXQZbL6DrhpT0WePQ_56uXd5Jaw3DfzI,467
342
356
  omlish/iterators/tools.py,sha256=SvXyyQJh7aceLYhRl6pQB-rfSaXw5IMIWukeEeOZt-0,2492
343
357
  omlish/iterators/unique.py,sha256=0jAX3kwzVfRNhe0Tmh7kVP_Q2WBIn8POo_O-rgFV0rQ,1390
344
- omlish/lang/__init__.py,sha256=wMfsQjBFNsZ_Y4352iEr0DlEnNebf26JmR4ETtDsQow,3948
358
+ omlish/lang/__init__.py,sha256=GqZ3exAAK7iphRf8e4d3CvAz7EptvmEOmCkmN06uYvQ,3986
345
359
  omlish/lang/cached.py,sha256=92TvRZQ6sWlm7dNn4hgl7aWKbX0J1XUEo3DRjBpgVQk,7834
346
360
  omlish/lang/clsdct.py,sha256=AjtIWLlx2E6D5rC97zQ3Lwq2SOMkbg08pdO_AxpzEHI,1744
347
361
  omlish/lang/cmp.py,sha256=5vbzWWbqdzDmNKAGL19z6ZfUKe5Ci49e-Oegf9f4BsE,1346
@@ -352,7 +366,7 @@ omlish/lang/exceptions.py,sha256=qJBo3NU1mOWWm-NhQUHCY5feYXR3arZVyEHinLsmRH4,47
352
366
  omlish/lang/functions.py,sha256=t9nsnWwhsibG0w908VMx-_pRM5tZfruE3faPxrCWTbI,4160
353
367
  omlish/lang/generators.py,sha256=5LX17j-Ej3QXhwBgZvRTm_dq3n9veC4IOUcVmvSu2vU,5243
354
368
  omlish/lang/imports.py,sha256=TXLbj2F53LsmozlM05bQhvow9kEgWJOi9qYKsnm2D18,9258
355
- omlish/lang/iterables.py,sha256=mE-XyhqMe9LztBf5Y36SDSO0Gtu8rIKmE-hcNvhhOX8,2085
369
+ omlish/lang/iterables.py,sha256=HOjcxOwyI5bBApDLsxRAGGhTTmw7fdZl2kEckxRVl-0,1994
356
370
  omlish/lang/maybes.py,sha256=1RN7chX_x2XvgUwryZRz0W7hAX-be3eEFcFub5vvf6M,3417
357
371
  omlish/lang/objects.py,sha256=LOC3JvX1g5hPxJ7Sv2TK9kNkAo9c8J-Jw2NmClR_rkA,4576
358
372
  omlish/lang/resolving.py,sha256=OuN2mDTPNyBUbcrswtvFKtj4xgH4H4WglgqSKv3MTy0,1606
@@ -377,6 +391,7 @@ omlish/lifecycles/transitions.py,sha256=qQtFby-h4VzbvgaUqT2NnbNumlcOx9FVVADP9t83
377
391
  omlish/lite/__init__.py,sha256=ISLhM4q0LR1XXTCaHdZOZxBRyIsoZqYm4u0bf1BPcVk,148
378
392
  omlish/lite/cached.py,sha256=O7ozcoDNFm1Hg2wtpHEqYSp_i_nCLNOP6Ueq_Uk-7mU,1300
379
393
  omlish/lite/check.py,sha256=0PD-GKtaDqDX6jU5KbzbMvH-vl6jH82xgYfplmfTQkg,12941
394
+ omlish/lite/configs.py,sha256=Ev_19sbII67pTWzInYjYqa9VyTiZBvyjhZqyG8TtufE,908
380
395
  omlish/lite/contextmanagers.py,sha256=m9JO--p7L7mSl4cycXysH-1AO27weDKjP3DZG61cwwM,1683
381
396
  omlish/lite/dataclasses.py,sha256=M6UD4VwGo0Ky7RNzKWbO0IOy7iBZVCIbTiC6EYbFnX8,1035
382
397
  omlish/lite/inject.py,sha256=qBUftFeXMiRgANYbNS2e7TePMYyFAcuLgsJiLyMTW5o,28769
@@ -390,6 +405,7 @@ omlish/lite/resources.py,sha256=YNSmX1Ohck1aoWRs55a-o5ChVbFJIQhtbqE-XwF55Oc,326
390
405
  omlish/lite/runtime.py,sha256=XQo408zxTdJdppUZqOWHyeUR50VlCpNIExNGHz4U6O4,459
391
406
  omlish/lite/secrets.py,sha256=3Mz3V2jf__XU9qNHcH56sBSw95L3U2UPL24bjvobG0c,816
392
407
  omlish/lite/strings.py,sha256=nGWaOi9LzTjkc5kPN2IqsVN8PUw8m_2yllTGRUQU5PI,1983
408
+ omlish/lite/types.py,sha256=fP5EMyBdEp2LmDxcHjUDtwAMdR06ISr9lKOL7smWfHM,140
393
409
  omlish/lite/typing.py,sha256=U3-JaEnkDSYxK4tsu_MzUn3RP6qALBe5FXQXpD-licE,1090
394
410
  omlish/logs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
395
411
  omlish/logs/abc.py,sha256=ho4ABKYMKX-V7g4sp1BByuOLzslYzLlQ0MESmjEpT-o,8005
@@ -574,14 +590,14 @@ omlish/testing/pytest/plugins/utils.py,sha256=L5C622UXcA_AUKDcvyh5IMiRfqSGGz0Mcd
574
590
  omlish/text/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
575
591
  omlish/text/asdl.py,sha256=AS3irh-sag5pqyH3beJif78PjCbOaFso1NeKq-HXuTs,16867
576
592
  omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
577
- omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
593
+ omlish/text/glyphsplit.py,sha256=kqqjglRdxGo0czYZxOz9Vi8aBmVsCOq8h6lPwRA5xe0,3803
578
594
  omlish/text/indent.py,sha256=XixaVnk9bvtBlH0n_cwN6yS5IyfrTWpe_alfu3_saLY,1341
579
595
  omlish/text/minja.py,sha256=KAmZ2POcLcxwF4DPKxdWa16uWxXmVz1UnJXLSwt4oZo,5761
580
596
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
581
597
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
582
- omlish-0.0.0.dev192.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
583
- omlish-0.0.0.dev192.dist-info/METADATA,sha256=clxVnn-6rG8Lb_XUMK9nXmgj4TFyY5m9_tc_xjyoVoA,4264
584
- omlish-0.0.0.dev192.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
585
- omlish-0.0.0.dev192.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
586
- omlish-0.0.0.dev192.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
587
- omlish-0.0.0.dev192.dist-info/RECORD,,
598
+ omlish-0.0.0.dev194.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
599
+ omlish-0.0.0.dev194.dist-info/METADATA,sha256=nhNsVPo6hNygJ8DxnRbJE-iqP-emALofRYUylUQkyJc,4264
600
+ omlish-0.0.0.dev194.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
601
+ omlish-0.0.0.dev194.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
602
+ omlish-0.0.0.dev194.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
603
+ omlish-0.0.0.dev194.dist-info/RECORD,,
omlish/configs/strings.py DELETED
@@ -1,96 +0,0 @@
1
- """
2
- TODO:
3
- - reflecty generalized rewriter, obviously..
4
- - env vars
5
- - coalescing - {$FOO|$BAR|baz}
6
- """
7
- import collections.abc
8
- import typing as ta
9
-
10
- from .. import dataclasses as dc
11
- from .. import lang
12
- from ..text import glyphsplit
13
-
14
-
15
- T = ta.TypeVar('T')
16
-
17
-
18
- class InterpolateStringsMetadata(lang.Marker):
19
- pass
20
-
21
-
22
- @dc.field_modifier
23
- def secret_or_key_field(f: dc.Field) -> dc.Field:
24
- return dc.update_field_metadata(f, {
25
- InterpolateStringsMetadata: True,
26
- })
27
-
28
-
29
- @dc.field_modifier
30
- def interpolate_field(f: dc.Field) -> dc.Field:
31
- return dc.update_field_metadata(f, {InterpolateStringsMetadata: True})
32
-
33
-
34
- class StringRewriter:
35
- def __init__(self, fn: ta.Callable[[str], str]) -> None:
36
- super().__init__()
37
- self._fn = fn
38
-
39
- def __call__(self, v: T, *, _soft: bool = False) -> T:
40
- if v is None:
41
- return None # type: ignore
42
-
43
- if dc.is_dataclass(v):
44
- kw = {}
45
- for f in dc.fields(v):
46
- fv = getattr(v, f.name)
47
- nfv = self(fv, _soft=not f.metadata.get(InterpolateStringsMetadata))
48
- if fv is not nfv:
49
- kw[f.name] = nfv
50
- if not kw:
51
- return v # type: ignore
52
- return dc.replace(v, **kw)
53
-
54
- if isinstance(v, str):
55
- if not _soft:
56
- v = self._fn(v) # type: ignore
57
- return v # type: ignore
58
-
59
- if isinstance(v, lang.BUILTIN_SCALAR_ITERABLE_TYPES):
60
- return v # type: ignore
61
-
62
- if isinstance(v, collections.abc.Mapping):
63
- nm = []
64
- b = False
65
- for mk, mv in v.items():
66
- nk, nv = self(mk, _soft=_soft), self(mv, _soft=_soft)
67
- nm.append((nk, nv))
68
- b |= nk is not mk or nv is not mv
69
- if not b:
70
- return v # type: ignore
71
- return v.__class__(nm) # type: ignore
72
-
73
- if isinstance(v, (collections.abc.Sequence, collections.abc.Set)):
74
- nl = []
75
- b = False
76
- for le in v:
77
- ne = self(le, _soft=_soft)
78
- nl.append(ne)
79
- b |= ne is not le
80
- if not b:
81
- return v # type: ignore
82
- return v.__class__(nl) # type: ignore
83
-
84
- return v
85
-
86
-
87
- def interpolate_strings(v: T, rpl: ta.Mapping[str, str]) -> T:
88
- def fn(v):
89
- if not v:
90
- return v
91
- sps = glyphsplit.split_braces(v)
92
- if len(sps) == 1 and isinstance(sps[0], str):
93
- return sps[0]
94
- return ''.join(rpl[p.s] if isinstance(p, glyphsplit.GlyphMatch) else p for p in sps)
95
-
96
- return StringRewriter(fn)(v)