omlish 0.0.0.dev352__py3-none-any.whl → 0.0.0.dev353__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of omlish might be problematic. Click here for more details.

omlish/.manifests.json CHANGED
@@ -125,7 +125,7 @@
125
125
  "module": ".formats.json5.codec",
126
126
  "attr": "_JSON5_LAZY_CODEC",
127
127
  "file": "omlish/formats/json5/codec.py",
128
- "line": 25,
128
+ "line": 54,
129
129
  "value": {
130
130
  "$.codecs.base.LazyLoadedCodec": {
131
131
  "mod_name": "omlish.formats.json5.codec",
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev352'
2
- __revision__ = '538038adb75dc291a13579ef39744033ae4c6fc2'
1
+ __version__ = '0.0.0.dev353'
2
+ __revision__ = 'eb296edf6f44e6692a1928f89169ac77fbee1816'
3
3
 
4
4
 
5
5
  #
@@ -10,7 +10,7 @@ class ProjectBase:
10
10
  authors = [{'name': 'wrmsr'}]
11
11
  urls = {'source': 'https://github.com/wrmsr/omlish'}
12
12
  license = {'text': 'BSD-3-Clause'}
13
- requires_python = '>=3.12'
13
+ requires_python = '>=3.13'
14
14
 
15
15
  version = __version__
16
16
 
@@ -77,22 +77,46 @@ def encode_string(
77
77
  lq: str | None = None,
78
78
  rq: str | None = None,
79
79
  escape_map: ta.Mapping[str, str] | None = None,
80
+ ensure_ascii: bool = False,
80
81
  ) -> str:
81
82
  """Return a JSON representation of a Python string."""
82
83
 
84
+ s = _convert_to_string(s)
85
+
86
+ lq, rq = _handle_encode_quote_args(q, lq, rq)
87
+
83
88
  if escape_map is None:
84
89
  escape_map = ESCAPE_MAP
85
90
 
86
- s = _convert_to_string(s)
91
+ if ensure_ascii:
92
+ pat = _ESCAPE_ASCII_PAT
87
93
 
88
- def replace(m):
89
- return escape_map[m.group(0)]
94
+ def replace(m):
95
+ s = m.group(0)
90
96
 
91
- lq, rq = _handle_encode_quote_args(q, lq, rq)
97
+ try:
98
+ return escape_map[s]
99
+
100
+ except KeyError:
101
+ n = ord(s)
102
+ if n < 0x10000:
103
+ return f'\\u{n:04x}'
104
+
105
+ # surrogate pair
106
+ n -= 0x10000
107
+ s1 = 0xD800 | ((n >> 10) & 0x3FF)
108
+ s2 = 0xDC00 | (n & 0x3FF)
109
+ return f'\\u{s1:04x}\\u{s2:04x}'
110
+
111
+ else:
112
+ pat = _ESCAPE_PAT
113
+
114
+ def replace(m):
115
+ return escape_map[m.group(0)]
92
116
 
93
117
  return ''.join([
94
118
  lq,
95
- _ESCAPE_PAT.sub(replace, s),
119
+ pat.sub(replace, s),
96
120
  rq,
97
121
  ])
98
122
 
@@ -107,35 +131,14 @@ def encode_string_ascii(
107
131
  ) -> str:
108
132
  """Return an ASCII-only JSON representation of a Python string."""
109
133
 
110
- if escape_map is None:
111
- escape_map = ESCAPE_MAP
112
-
113
- s = _convert_to_string(s)
114
-
115
- def replace(m):
116
- s = m.group(0)
117
-
118
- try:
119
- return escape_map[s]
120
-
121
- except KeyError:
122
- n = ord(s)
123
- if n < 0x10000:
124
- return f'\\u{n:04x}'
125
-
126
- # surrogate pair
127
- n -= 0x10000
128
- s1 = 0xD800 | ((n >> 10) & 0x3FF)
129
- s2 = 0xDC00 | (n & 0x3FF)
130
- return f'\\u{s1:04x}\\u{s2:04x}'
131
-
132
- lq, rq = _handle_encode_quote_args(q, lq, rq)
133
-
134
- return ''.join([
135
- lq,
136
- str(_ESCAPE_ASCII_PAT.sub(replace, s)),
137
- rq,
138
- ])
134
+ return encode_string(
135
+ s,
136
+ q,
137
+ lq=lq,
138
+ rq=rq,
139
+ escape_map=escape_map,
140
+ ensure_ascii=True,
141
+ )
139
142
 
140
143
 
141
144
  ##
@@ -1,5 +1,7 @@
1
1
  from .codec import ( # noqa
2
2
  dumps,
3
+ dumps_pretty,
4
+ dumps_compact,
3
5
  loads,
4
6
  )
5
7
 
@@ -1,20 +1,49 @@
1
1
  import typing as ta
2
2
 
3
+ from ... import lang
3
4
  from .. import json
4
5
  from ..codecs import make_object_lazy_loaded_codec
5
6
  from ..codecs import make_str_object_codec
6
- from .parsing import parse
7
+
8
+
9
+ if ta.TYPE_CHECKING:
10
+ from . import parsing
11
+ from . import rendering
12
+ else:
13
+ parsing = lang.proxy_import('.parsing', __package__)
14
+ rendering = lang.proxy_import('.rendering', __package__)
7
15
 
8
16
 
9
17
  ##
10
18
 
11
19
 
12
- def dumps(obj: ta.Any) -> str:
13
- return json.dumps(obj)
20
+ def dumps(
21
+ obj: ta.Any,
22
+ *,
23
+ multiline_strings: bool = False,
24
+ **kwargs: ta.Any,
25
+ ) -> str:
26
+ if multiline_strings:
27
+ return rendering.Json5Renderer.render_str(
28
+ obj,
29
+ multiline_strings=True,
30
+ **kwargs,
31
+ )
32
+
33
+ else:
34
+ return json.dumps(obj, **kwargs)
35
+
36
+
37
+ def dumps_pretty(obj: ta.Any, **kwargs: ta.Any) -> str:
38
+ return dumps(obj, **json.PRETTY_KWARGS, **kwargs)
39
+
40
+
41
+ def dumps_compact(obj: ta.Any, **kwargs: ta.Any) -> str:
42
+ return dumps(obj, **json.COMPACT_KWARGS, **kwargs)
14
43
 
15
44
 
16
- def loads(s: str) -> ta.Any:
17
- return parse(s)
45
+ def loads(s: str, **kwargs: ta.Any) -> ta.Any:
46
+ return parsing.parse(s, **kwargs)
18
47
 
19
48
 
20
49
  ##
omlish/http/coro/fdio.py CHANGED
@@ -39,7 +39,13 @@ class CoroHttpServerConnectionFdioHandler(SocketFdioHandler):
39
39
  addr,
40
40
  handler=self._handler,
41
41
  )
42
- self._srv_coro: ta.Optional[ta.Generator[CoroHttpServer.Io, ta.Optional[bytes], None]] = self._coro_srv.coro_handle() # noqa
42
+ self._srv_coro: ta.Optional[
43
+ ta.Generator[
44
+ CoroHttpServer.Io,
45
+ ta.Optional[bytes],
46
+ CoroHttpServer.CoroHandleResult,
47
+ ],
48
+ ] = self._coro_srv.coro_handle()
43
49
 
44
50
  self._cur_io: ta.Optional[CoroHttpServer.Io] = None
45
51
  self._next_io()
@@ -417,7 +417,11 @@ class CoroHttpServer:
417
417
 
418
418
  #
419
419
 
420
- def coro_handle(self) -> ta.Generator[Io, ta.Optional[bytes], None]:
420
+ @dc.dataclass(frozen=True)
421
+ class CoroHandleResult:
422
+ close_reason: ta.Literal['response', 'internal', None] = None
423
+
424
+ def coro_handle(self) -> ta.Generator[Io, ta.Optional[bytes], CoroHandleResult]:
421
425
  return self._coro_run_handler(self._coro_handle_one())
422
426
 
423
427
  class Close(Exception): # noqa
@@ -430,7 +434,7 @@ class CoroHttpServer:
430
434
  ta.Optional[bytes],
431
435
  None,
432
436
  ],
433
- ) -> ta.Generator[Io, ta.Optional[bytes], None]:
437
+ ) -> ta.Generator[Io, ta.Optional[bytes], CoroHandleResult]:
434
438
  i: ta.Optional[bytes]
435
439
  o: ta.Any = next(gen)
436
440
  while True:
@@ -454,7 +458,9 @@ class CoroHttpServer:
454
458
 
455
459
  o.close()
456
460
  if o.close_connection:
457
- break
461
+ return self.CoroHandleResult(
462
+ close_reason='response',
463
+ )
458
464
  o = None
459
465
 
460
466
  else:
@@ -463,9 +469,11 @@ class CoroHttpServer:
463
469
  try:
464
470
  o = gen.send(i)
465
471
  except self.Close:
466
- return
472
+ return self.CoroHandleResult(
473
+ close_reason='internal',
474
+ )
467
475
  except StopIteration:
468
- break
476
+ return self.CoroHandleResult()
469
477
 
470
478
  except Exception: # noqa
471
479
  if hasattr(o, 'close'):
@@ -39,6 +39,7 @@ def make_simple_http_server(
39
39
  handler: HttpHandler,
40
40
  *,
41
41
  server_version: HttpProtocolVersion = HttpProtocolVersions.HTTP_1_1,
42
+ keep_alive: bool = False,
42
43
  ssl_context: ta.Optional['ssl.SSLContext'] = None,
43
44
  ignore_ssl_errors: bool = False,
44
45
  executor: ta.Optional[cf.Executor] = None,
@@ -60,6 +61,7 @@ def make_simple_http_server(
60
61
 
61
62
  socket_handler = CoroHttpServerSocketHandler(
62
63
  server_factory,
64
+ keep_alive=keep_alive,
63
65
  )
64
66
 
65
67
  #
@@ -1,7 +1,9 @@
1
1
  # ruff: noqa: UP006 UP007 UP045
2
2
  # @omlish-lite
3
+ import itertools
3
4
  import typing as ta
4
5
 
6
+ from ...lite.check import check
5
7
  from ...sockets.addresses import SocketAddress
6
8
  from ...sockets.handlers import SocketHandler_
7
9
  from ...sockets.io import SocketIoPair
@@ -17,16 +19,32 @@ class CoroHttpServerSocketHandler(SocketHandler_):
17
19
  self,
18
20
  server_factory: CoroHttpServerFactory,
19
21
  *,
22
+ keep_alive: bool = False,
20
23
  log_handler: ta.Optional[ta.Callable[[CoroHttpServer, CoroHttpServer.AnyLogIo], None]] = None,
21
24
  ) -> None:
22
25
  super().__init__()
23
26
 
24
27
  self._server_factory = server_factory
28
+ self._keep_alive = keep_alive
25
29
  self._log_handler = log_handler
26
30
 
27
31
  def __call__(self, client_address: SocketAddress, fp: SocketIoPair) -> None:
28
32
  server = self._server_factory(client_address)
29
33
 
34
+ if self._keep_alive:
35
+ for i in itertools.count(): # noqa
36
+ res = self._handle_one(server, fp)
37
+ if res.close_reason is not None:
38
+ break
39
+
40
+ else:
41
+ self._handle_one(server, fp)
42
+
43
+ def _handle_one(
44
+ self,
45
+ server: CoroHttpServer,
46
+ fp: SocketIoPair,
47
+ ) -> CoroHttpServer.CoroHandleResult:
30
48
  gen = server.coro_handle()
31
49
 
32
50
  o = next(gen)
@@ -55,5 +73,5 @@ class CoroHttpServerSocketHandler(SocketHandler_):
55
73
  o = gen.send(i)
56
74
  else:
57
75
  o = next(gen)
58
- except StopIteration:
59
- break
76
+ except StopIteration as e:
77
+ return check.isinstance(e.value, CoroHttpServer.CoroHandleResult)
omlish/lang/__init__.py CHANGED
@@ -146,6 +146,11 @@ from .contextmanagers import ( # noqa
146
146
  )
147
147
 
148
148
  from .datetimes import ( # noqa
149
+ ISO_FMT,
150
+ ISO_FMT_US,
151
+ ISO_FMT_NTZ,
152
+ ISO_FMT_US_NTZ,
153
+
149
154
  utcnow,
150
155
  utcfromtimestamp,
151
156
  )
omlish/lang/datetimes.py CHANGED
@@ -4,6 +4,16 @@ import datetime
4
4
  ##
5
5
 
6
6
 
7
+ ISO_FMT = '%Y-%m-%dT%H:%M:%S%z'
8
+ ISO_FMT_US = '%Y-%m-%dT%H:%M:%S.%f%z'
9
+
10
+ ISO_FMT_NTZ = '%Y-%m-%dT%H:%M:%S'
11
+ ISO_FMT_US_NTZ = '%Y-%m-%dT%H:%M:%S.%f'
12
+
13
+
14
+ #
15
+
16
+
7
17
  def utcnow() -> datetime.datetime:
8
18
  return datetime.datetime.now(tz=datetime.UTC)
9
19
 
omlish/lang/outcomes.py CHANGED
@@ -203,7 +203,7 @@ class Outcome(abc.ABC, ta.Generic[ValueT_co]):
203
203
  class Value(Outcome[ValueT_co], ta.Generic[ValueT_co]):
204
204
  """Concrete :class:`Outcome` subclass representing a regular value."""
205
205
 
206
- _value: ValueT_co
206
+ _value: ValueT_co # type: ignore[misc] # FIXME: Cannot use a covariant type variable as a parameter
207
207
 
208
208
  def __repr__(self) -> str:
209
209
  return f'Value({self._value!r})'
omlish/lang/sys.py CHANGED
@@ -4,7 +4,7 @@ import sys
4
4
  ##
5
5
 
6
6
 
7
- REQUIRED_PYTHON_VERSION = (3, 12)
7
+ REQUIRED_PYTHON_VERSION = (3, 13)
8
8
 
9
9
 
10
10
  def check_runtime_version() -> None:
omlish/os/linux.py CHANGED
@@ -19,7 +19,7 @@ ID=ubuntu
19
19
  ID_LIKE=debian
20
20
  UBUNTU_CODENAME=jammy
21
21
 
22
- ➜ omlish git:(master) docker run -i python:3.12 cat /etc/os-release
22
+ ➜ omlish git:(master) docker run -i python:3.13 cat /etc/os-release
23
23
  PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
24
24
  NAME="Debian GNU/Linux"
25
25
  VERSION_ID="12"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev352
3
+ Version: 0.0.0.dev353
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -10,7 +10,7 @@ Classifier: Development Status :: 2 - Pre-Alpha
10
10
  Classifier: Intended Audience :: Developers
11
11
  Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
- Requires-Python: >=3.12
13
+ Requires-Python: >=3.13
14
14
  License-File: LICENSE
15
15
  Provides-Extra: all
16
16
  Requires-Dist: anyio~=4.9; extra == "all"
@@ -1,5 +1,5 @@
1
- omlish/.manifests.json,sha256=orgsRvtpHu8tdhaCvlP9v3P495OJopYYiHKjK68WtWg,8587
2
- omlish/__about__.py,sha256=1QrsZ7a4tfaOZ2X4I1KvbNEhVOyaYwWqS4vdXo7oCaM,3478
1
+ omlish/.manifests.json,sha256=Egsh9irGGefBuu0l9ppa8a-6lo-r9iD7DnUYVmHaTMY,8587
2
+ omlish/__about__.py,sha256=sKHGEGFJIvff1zQHTqExCpHnwV0__sUW7Hyjb7QqZYY,3478
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=rer-TPOFDU6fYq_AWio_AmA-ckZ8JDY5shIzQ_yXfzA,8414
5
5
  omlish/cached.py,sha256=MLap_p0rdGoDIMVhXVHm1tsbcWobJF0OanoodV03Ju8,542
@@ -265,7 +265,7 @@ omlish/formats/json/__init__.py,sha256=i41uhoyXjuLjj5JmdRj4Ud2sfKD0j6KAyk_XyyCIB
265
265
  omlish/formats/json/codecs.py,sha256=wvPHZw8cDHaOV6u7e9rfpCH3JVF_IjA6ND_fQUhcCXU,844
266
266
  omlish/formats/json/consts.py,sha256=A0cTAGGLyjo-gcYIQrL4JIaardI0yPMhQoNmh42BaRg,387
267
267
  omlish/formats/json/encoding.py,sha256=iwoYyJePibgvRDZ6e9b2OlXmOBJEczquRNoiffVf3hE,502
268
- omlish/formats/json/literals.py,sha256=sJb4c1FhM9Ms0c0suByMA5i7WXI-pSLsmnPVaQd-qCw,8106
268
+ omlish/formats/json/literals.py,sha256=EG-nZpi7Eaalo8PJWceeYq_yKj55PxmaSme6csFBO_M,8185
269
269
  omlish/formats/json/rendering.py,sha256=5p8kG1t3aGm2GXsb82h1S90Mmz4lzbX8sX9_qh7fH1U,4915
270
270
  omlish/formats/json/types.py,sha256=ueO9-uOU2eVWowJf0LH1fHFLjZ6fTIZyq9qybcLQaiQ,147
271
271
  omlish/formats/json/backends/__init__.py,sha256=K5nAP-fCgUvaSylHqgRvmJp6j6PTWdMjrNhvMouKrFc,161
@@ -283,8 +283,8 @@ omlish/formats/json/stream/parsing.py,sha256=AXsg0N5s0jEvdfEQrzprplZDNkB62l6Q3Pv
283
283
  omlish/formats/json/stream/rendering.py,sha256=uuJc__MR0G5kypYMAAudBNjBfiIzA_GGli-DWT90428,3730
284
284
  omlish/formats/json/stream/utils.py,sha256=UhBRuWbb25wrdQWl8Ttq7xGRLoa329TvNdecGCZxgzg,1197
285
285
  omlish/formats/json5/Json5.g4,sha256=ZUmgJPvj8lSMUD_v3wijp10ZQExYB5mu5Q089dYEJSU,2389
286
- omlish/formats/json5/__init__.py,sha256=BsjPz5zJDji3GjQ8x8hWvcl1GYPV_ZIHnE3c2Sr8aTU,102
287
- omlish/formats/json5/codec.py,sha256=ldnxCRo0JP1fkGLt0mMxJlLvNxqIF_1KUCcSp1HtI-M,452
286
+ omlish/formats/json5/__init__.py,sha256=5D7pUwtS8HMgs8rGJG3xUBLhOq5uFUULcwE-jIlpwmY,139
287
+ omlish/formats/json5/codec.py,sha256=IVllnRk5Nc0CnrsPiC36P1Mh8MZeasU-yq8OBZRtIk0,1185
288
288
  omlish/formats/json5/errors.py,sha256=AHkR9ySjAoQdUrizpqgL8fg0M5oe5mHZkml3KZHEvC4,38
289
289
  omlish/formats/json5/literals.py,sha256=rj4-9KFXfgdq5oK_eUkp57cgoMQ8T0gRaG9ga430he4,2429
290
290
  omlish/formats/json5/parsing.py,sha256=CWJHfe_FXCQuyDk00a7PI5wOdROq7Tc3fbWrNuwaKCw,2346
@@ -336,10 +336,10 @@ omlish/http/clients/default.py,sha256=fO8So3pI2z8ateLqt9Sv50UoOJFkUZbgMdoDyWsjBN
336
336
  omlish/http/clients/httpx.py,sha256=Grl9_sG7QNIZj8HqaU7XduAsBDyfXl36RjbYQzQqal0,1787
337
337
  omlish/http/clients/urllib.py,sha256=DVKFPLQzANiZmwnlbFw5pWs5ZPLLvvgCb3UInvCSqPE,2701
338
338
  omlish/http/coro/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
339
- omlish/http/coro/fdio.py,sha256=kyCGyADX4ECHEx-1pb1VgEMI7r9MNyNRUScqJXIkL6c,4041
340
- omlish/http/coro/server.py,sha256=8uqB1LFQy16UuKNppC9GjmdDRZ0Bs9Dpf-nyUe_2row,18265
341
- omlish/http/coro/simple.py,sha256=PMWy295kj24uds0QxpcGzreQuWPV2OEm6RPBtbvUEp0,3206
342
- omlish/http/coro/sockets.py,sha256=lSJYoCcmjQeWOeDl7VfR8e3DUEfu8mWskhoSq2LD_nQ,1660
339
+ omlish/http/coro/fdio.py,sha256=mFhOzUocGOwrxLbSssULHora3hINfTcOwLOggXemYag,4146
340
+ omlish/http/coro/server.py,sha256=L8EO-Iok4ExlM-2LTDQOCZilLRdDNO2wvn1DN8dghR0,18641
341
+ omlish/http/coro/simple.py,sha256=wpIDGa4AYndmAq2mCCj2IWpkLx67uM3JpKXKgrHLiD8,3275
342
+ omlish/http/coro/sockets.py,sha256=ziTzdDCsw3mrwskoGBa4stqkm21ReNq6BtrM-ZkxB3k,2257
343
343
  omlish/inject/__init__.py,sha256=pY-A8Q4v08-Xa4a-XdZ3lSFC3OwCO2T9HhesB67Q4tQ,1895
344
344
  omlish/inject/binder.py,sha256=3-6KMOcSgFE5bvthy3YUrRzCX5w7YSGmdJ3Tv2yXZGw,4022
345
345
  omlish/inject/bindings.py,sha256=PlvOnUREjvc6F8nOJdzl1k9SAf80icRB4qWFqDop87M,536
@@ -404,14 +404,14 @@ omlish/iterators/iterators.py,sha256=RxW35yQ5ed8vBQ22IqpDXFx-i5JiLQdp7-pkMZXhJJ8
404
404
  omlish/iterators/recipes.py,sha256=wOwOZg-zWG9Zc3wcAxJFSe2rtavVBYwZOfG09qYEx_4,472
405
405
  omlish/iterators/tools.py,sha256=M16LXrJhMdsz5ea2qH0vws30ZvhQuQSCVFSLpRf_gTg,2096
406
406
  omlish/iterators/unique.py,sha256=Nw0pSaNEcHAkve0ugfLPvJcirDOn9ECyC5wIL8JlJKI,1395
407
- omlish/lang/__init__.py,sha256=vk7k-NT3QWB_YcBPAO6_ml2z3feVLuq69pweWX8ECOk,6445
407
+ omlish/lang/__init__.py,sha256=IGHLuq5B1H3BPj8cnShqsHdw33QcYFWNny8UU3Rym1A,6512
408
408
  omlish/lang/attrs.py,sha256=zFiVuGVOq88x45464T_LxDa-ZEq_RD9zJLq2zeVEBDc,5105
409
409
  omlish/lang/casing.py,sha256=cFUlbDdXLhwnWwcYx4qnM5c4zGX7hIRUfcjiZbxUD28,4636
410
410
  omlish/lang/clsdct.py,sha256=HAGIvBSbCefzRjXriwYSBLO7QHKRv2UsE78jixOb-fA,1828
411
411
  omlish/lang/collections.py,sha256=LVm0Sory60IXyFzYhhO8BZAWy_z_pjiA-meXNlSJP7o,2465
412
412
  omlish/lang/comparison.py,sha256=MOwEG0Yny-jBPHO9kQto9FSRyeNpQW24UABsghkrHxY,1356
413
413
  omlish/lang/contextmanagers.py,sha256=Cv6lLCKFSBpJO9TGph4wyLlVs_kxKK98KI8pC_rS0FI,7226
414
- omlish/lang/datetimes.py,sha256=mrTtA67JYpfQwSlzdPcBtvm6dAyYM_dXNnlxFwFQH0M,228
414
+ omlish/lang/datetimes.py,sha256=01tg21QOx-PWDlm-CSFTalym3vpqF0EKzeinmtcVNoU,379
415
415
  omlish/lang/descriptors.py,sha256=zBtgO9LjdSTGHNUgiIqswh78WOVoGH6KzS0NbgB1Wls,6572
416
416
  omlish/lang/enums.py,sha256=F9tflHfaAoV2MpyuhZzpfX9-H55M3zNa9hCszsngEo8,111
417
417
  omlish/lang/functions.py,sha256=qNqzWF6vI6PGTzKhgkhnNXP8e1gSerb8GsHG3_wVBP8,6386
@@ -419,14 +419,14 @@ omlish/lang/generators.py,sha256=a4D5HU_mySs2T2z3xCmE_s3t4QJkj0YRrK4-hhpGd0A,519
419
419
  omlish/lang/imports.py,sha256=y9W9Y-d_cQ35QCLuSIPoa6vnEqSErFCz8b-34IH128U,10552
420
420
  omlish/lang/iterables.py,sha256=y1SX2Co3VsOeX2wlfFF7K3rwLvF7Dtre7VY6EpfwAwA,3338
421
421
  omlish/lang/objects.py,sha256=ZsibJwNp1EXorbaObm9TlCNtuuM65snCmVb7H4_llqI,6116
422
- omlish/lang/outcomes.py,sha256=mpFy_VoM-b74L1aCFsjsZVUHx_icZ1AHMOKeVesjOp4,8628
422
+ omlish/lang/outcomes.py,sha256=0PqxoKaGbBXU9UYZ6AE2QSq94Z-gFDt6wYdp0KomNQw,8712
423
423
  omlish/lang/overrides.py,sha256=IBzK6ljfLX6TLgIyKTSjhqTLcuKRkQNVtEOnBLS4nuA,2095
424
424
  omlish/lang/params.py,sha256=sfbNoGrKCsAtubFufj_uh_WKshIgA8fqJ4PmLH1PH00,6639
425
425
  omlish/lang/recursion.py,sha256=1VfSqzKO-8Is3t9LKw0W4jwPfE0aBS70EUlbUxAx4eE,1900
426
426
  omlish/lang/resolving.py,sha256=ei9LDyJexsMMHB9z8diUkNmynWhd_da7h7TqrMYM6lA,1611
427
427
  omlish/lang/resources.py,sha256=WKkAddC3ctMK1bvGw-elGe8ZxAj2IaUTKVSu2nfgHTo,2839
428
428
  omlish/lang/strings.py,sha256=kJmRFd1D36xXcjd9MdB12BCwF_-MVhNr-TpWj7hMi_4,4252
429
- omlish/lang/sys.py,sha256=b4qOPiJZQru_mbb04FNfOjYWUxlV2becZOoc-yya_rQ,411
429
+ omlish/lang/sys.py,sha256=KPe1UOXk1VxlOYt_aLmhN0KqsA4wnP-4nm4WEwO49pw,411
430
430
  omlish/lang/typing.py,sha256=eWI3RKhVi-_SV2rN4SGq8IbFo5XbGapbiWeduF97uG8,3846
431
431
  omlish/lang/cached/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
432
432
  omlish/lang/cached/function.py,sha256=su9QxYECK9NK-UfMFKbgx4lqH2WoGBiYshnEfaGvfhw,11522
@@ -551,7 +551,7 @@ omlish/os/filemodes.py,sha256=prgEmqLrFolGsHgc-rNRRFSo2k4BudEQiMoBAyik8Ig,4581
551
551
  omlish/os/files.py,sha256=5ZnxeuHE1rYi6IpIvkFEJW-OFuoYEXO0waYa4WDvbl8,1112
552
552
  omlish/os/forkhooks.py,sha256=sLrDCOletKcuiKTKIstksmvYw8GNg5e5yHUGuJ0dEeo,5678
553
553
  omlish/os/journald.py,sha256=Ysm-lyjBfTvRA9PZtkdNxeFNNuSdLwoCXnBgePeRu3Y,3909
554
- omlish/os/linux.py,sha256=9BNpUov6k0vlk-W7PPh5ejToSglZZpSskt5LlENdTLA,18944
554
+ omlish/os/linux.py,sha256=Vns2CDAS9HChEb4i-19c-ey4_MRG1DgGA1vb5b3lS9o,18944
555
555
  omlish/os/mangle.py,sha256=W-LP7nIkMXl0y4a1Qir1RIT2q1z_Ghct2PIVUnf-cQs,530
556
556
  omlish/os/paths.py,sha256=uQbzLumxGxaIpt0bdOr-Q75gc2VpZX9nWEHX8d4iEyY,850
557
557
  omlish/os/signals.py,sha256=WJfW21RdFjGsSmXmFjr9I-AuYh3rmi7wMjZfMkJRPXE,353
@@ -866,9 +866,9 @@ omlish/typedvalues/marshal.py,sha256=AtBz7Jq-BfW8vwM7HSxSpR85JAXmxK2T0xDblmm1HI0
866
866
  omlish/typedvalues/of_.py,sha256=UXkxSj504WI2UrFlqdZJbu2hyDwBhL7XVrc2qdR02GQ,1309
867
867
  omlish/typedvalues/reflect.py,sha256=PAvKW6T4cW7u--iX80w3HWwZUS3SmIZ2_lQjT65uAyk,1026
868
868
  omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
869
- omlish-0.0.0.dev352.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
870
- omlish-0.0.0.dev352.dist-info/METADATA,sha256=jtHXPRnomM-Ci8TwuWsGIHCGIR2pFERjLhvwLc9hcZE,4416
871
- omlish-0.0.0.dev352.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
872
- omlish-0.0.0.dev352.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
873
- omlish-0.0.0.dev352.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
874
- omlish-0.0.0.dev352.dist-info/RECORD,,
869
+ omlish-0.0.0.dev353.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
870
+ omlish-0.0.0.dev353.dist-info/METADATA,sha256=sdAJ_0gr9hDTDSpMvCSVvIDgX5o01tyzUBFy0w3MpDU,4416
871
+ omlish-0.0.0.dev353.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
872
+ omlish-0.0.0.dev353.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
873
+ omlish-0.0.0.dev353.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
874
+ omlish-0.0.0.dev353.dist-info/RECORD,,