omlish 0.0.0.dev261__py3-none-any.whl → 0.0.0.dev263__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/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev261'
2
- __revision__ = '3c82002e38d6309590759b67148331f48f2b7149'
1
+ __version__ = '0.0.0.dev263'
2
+ __revision__ = '57f33e2582f051883b2e8cd84101c5f06899484b'
3
3
 
4
4
 
5
5
  #
@@ -1,5 +1,5 @@
1
1
  # ruff: noqa: I001
2
- from .asyncio import ( # noqa
2
+ from .utils import ( # noqa
3
3
  asyncio_ensure_task as ensure_task,
4
4
 
5
5
  asyncio_once as once,
omlish/c3.py CHANGED
@@ -33,6 +33,7 @@
33
33
  #
34
34
  # 8. By copying, installing or otherwise using Python, Licensee agrees to be bound by the terms and conditions of this
35
35
  # License Agreement.
36
+ import functools
36
37
  import operator
37
38
  import typing as ta
38
39
 
@@ -40,6 +41,9 @@ import typing as ta
40
41
  T = ta.TypeVar('T')
41
42
 
42
43
 
44
+ ##
45
+
46
+
43
47
  def merge(seqs: ta.MutableSequence[list[T]]) -> list[T]:
44
48
  """
45
49
  Merges MROs in *sequences* to a single MRO using the C3 algorithm.
@@ -70,12 +74,17 @@ def merge(seqs: ta.MutableSequence[list[T]]) -> list[T]:
70
74
  del seq[0]
71
75
 
72
76
 
77
+ def _default_is_abstract(obj: ta.Any) -> bool:
78
+ return hasattr(obj, '__abstractmethods__')
79
+
80
+
73
81
  def mro(
74
82
  cls: T,
75
83
  abcs: ta.Sequence[T] | None = None,
76
84
  *,
77
85
  get_bases: ta.Callable[[T], ta.Sequence[T]] = operator.attrgetter('__bases__'),
78
86
  is_subclass: ta.Callable[[T, T], bool] = issubclass, # type: ignore
87
+ is_abstract: ta.Callable[[T], bool] = _default_is_abstract,
79
88
  ) -> list[T]:
80
89
  """
81
90
  Computes the method resolution order using extended C3 linearization.
@@ -91,7 +100,7 @@ def mro(
91
100
  """
92
101
 
93
102
  for i, base in enumerate(reversed(get_bases(cls))):
94
- if hasattr(base, '__abstractmethods__'):
103
+ if is_abstract(base):
95
104
  boundary = len(get_bases(cls)) - i
96
105
  break # Bases up to the last explicit ABC are considered first.
97
106
  else:
@@ -109,9 +118,16 @@ def mro(
109
118
  abstract_bases.append(base)
110
119
  for base in abstract_bases:
111
120
  abcs.remove(base)
112
- explicit_c3_mros = [mro(base, abcs=abcs, get_bases=get_bases, is_subclass=is_subclass) for base in explicit_bases]
113
- abstract_c3_mros = [mro(base, abcs=abcs, get_bases=get_bases, is_subclass=is_subclass) for base in abstract_bases]
114
- other_c3_mros = [mro(base, abcs=abcs, get_bases=get_bases, is_subclass=is_subclass) for base in other_bases]
121
+ rec = functools.partial(
122
+ mro,
123
+ abcs=abcs,
124
+ get_bases=get_bases,
125
+ is_subclass=is_subclass,
126
+ is_abstract=is_abstract,
127
+ )
128
+ explicit_c3_mros = [rec(base) for base in explicit_bases]
129
+ abstract_c3_mros = [rec(base) for base in abstract_bases]
130
+ other_c3_mros = [rec(base) for base in other_bases]
115
131
  return merge(
116
132
  [[cls]] + # noqa
117
133
  explicit_c3_mros + abstract_c3_mros + other_c3_mros +
@@ -127,6 +143,7 @@ def compose_mro(
127
143
  get_bases: ta.Callable[[T], ta.Sequence[T]] = operator.attrgetter('__bases__'),
128
144
  is_subclass: ta.Callable[[T, T], bool] = issubclass, # type: ignore
129
145
  get_subclasses: ta.Callable[[T], ta.Iterable[T]] = operator.methodcaller('__subclasses__'),
146
+ is_abstract: ta.Callable[[T], bool] = _default_is_abstract,
130
147
  ) -> list[T]:
131
148
  """
132
149
  Calculates the method resolution order for a given class *cls*.
@@ -171,4 +188,10 @@ def compose_mro(
171
188
  if subcls not in _mro:
172
189
  _mro.append(subcls)
173
190
 
174
- return mro(cls, abcs=_mro, get_bases=get_bases, is_subclass=is_subclass)
191
+ return mro(
192
+ cls,
193
+ abcs=_mro,
194
+ get_bases=get_bases,
195
+ is_subclass=is_subclass,
196
+ is_abstract=is_abstract,
197
+ )
omlish/datetimes.py CHANGED
@@ -5,6 +5,9 @@ import re
5
5
  import typing as ta
6
6
 
7
7
 
8
+ ##
9
+
10
+
8
11
  def to_seconds(value: datetime.timedelta) -> float:
9
12
  return 86400 * value.days + value.seconds + 0.000001 * value.microseconds
10
13
 
omlish/defs.py CHANGED
@@ -13,6 +13,9 @@ import threading
13
13
  from . import lang
14
14
 
15
15
 
16
+ ##
17
+
18
+
16
19
  _repr = repr
17
20
 
18
21
  BASICS = {}
omlish/dynamic.py CHANGED
@@ -21,6 +21,9 @@ from . import lang
21
21
  T = ta.TypeVar('T')
22
22
 
23
23
 
24
+ ##
25
+
26
+
24
27
  _HOISTED_CODE_DEPTH: ta.MutableMapping[types.CodeType, int] = weakref.WeakKeyDictionary()
25
28
  _MAX_HOIST_DEPTH = 0
26
29
 
@@ -100,7 +103,6 @@ class Var(ta.Generic[T]):
100
103
 
101
104
  def outer(fn):
102
105
  class Descriptor:
103
-
104
106
  @staticmethod
105
107
  @functools.wraps(fn)
106
108
  def __call__(*args, **kwargs): # noqa
@@ -0,0 +1,48 @@
1
+ import dataclasses as dc
2
+ import typing as ta
3
+
4
+ from .... import lang
5
+ from .build import JsonObjectBuilder
6
+ from .lex import JsonStreamLexer
7
+ from .parse import JsonStreamParser
8
+
9
+
10
+ ##
11
+
12
+
13
+ @dc.dataclass(kw_only=True)
14
+ class JsonStreamObjectParser(lang.ExitStacked):
15
+ include_raw: bool = False
16
+ yield_object_lists: bool = False
17
+
18
+ #
19
+
20
+ _lex: JsonStreamLexer = dc.field(init=False)
21
+ _parse: JsonStreamParser = dc.field(init=False)
22
+ _build: JsonObjectBuilder = dc.field(init=False)
23
+
24
+ def _enter_contexts(self) -> None:
25
+ self._lex = JsonStreamLexer(
26
+ include_raw=self.include_raw,
27
+ )
28
+
29
+ self._parse = JsonStreamParser()
30
+
31
+ self._build = JsonObjectBuilder(
32
+ yield_object_lists=self.yield_object_lists,
33
+ )
34
+
35
+ def feed(self, i: ta.Iterable[str]) -> ta.Iterator[ta.Any]:
36
+ for c in i:
37
+ for t in self._lex(c):
38
+ for e in self._parse(t):
39
+ for v in self._build(e): # noqa
40
+ yield v
41
+
42
+
43
+ def stream_parse_one_object(
44
+ i: ta.Iterable[str],
45
+ **kwargs: ta.Any,
46
+ ) -> ta.Any:
47
+ with JsonStreamObjectParser(**kwargs) as p:
48
+ return next(p.feed(i))
omlish/lang/__init__.py CHANGED
@@ -142,6 +142,7 @@ from .functions import ( # noqa
142
142
  maybe_call,
143
143
  opt_coalesce,
144
144
  opt_fn,
145
+ opt_kw,
145
146
  periodically,
146
147
  raise_,
147
148
  raising,
omlish/lang/functions.py CHANGED
@@ -219,3 +219,10 @@ def opt_coalesce(*vs: T | None) -> T | None:
219
219
  if v is not None:
220
220
  return v
221
221
  return None
222
+
223
+
224
+ ##
225
+
226
+
227
+ def opt_kw(**kwargs: ta.Any) -> dict[str, ta.Any]:
228
+ return {k: v for k, v in kwargs.items() if k is not None}
@@ -1,3 +1,7 @@
1
+ """
2
+ TODO:
3
+ - why didn't this just use set_inheritable(wfd, False)?
4
+ """
1
5
  import os
2
6
  import typing as ta
3
7
  import weakref
omlish/os/forkhooks.py CHANGED
@@ -220,8 +220,8 @@ class ProcessOriginTracker:
220
220
  def __init__(self, **kwargs: ta.Any) -> None:
221
221
  super().__init__(**kwargs)
222
222
 
223
- self._process_cookie: bytes | None = self._PROCESS_COOKIE
224
- self._fork_depth: int | None = get_fork_depth()
223
+ self._process_cookie: ta.Optional[bytes] = self._PROCESS_COOKIE
224
+ self._fork_depth: ta.Optional[int] = get_fork_depth()
225
225
 
226
226
  def is_in_origin_process(self) -> bool:
227
227
  return (self._PROCESS_COOKIE, get_fork_depth()) == (self._process_cookie, self._fork_depth)
@@ -4,7 +4,6 @@ import contextlib
4
4
  import os
5
5
  import threading
6
6
  import typing as ta
7
- import weakref
8
7
 
9
8
  from ...lite.check import check
10
9
  from ..forkhooks import ForkHook
@@ -23,7 +22,7 @@ class _PidfileManager(ForkHook):
23
22
  """
24
23
 
25
24
  _lock: ta.ClassVar[threading.Lock] = threading.Lock()
26
- _pidfile_threads: ta.ClassVar[ta.MutableMapping[Pidfile, threading.Thread]] = weakref.WeakKeyDictionary()
25
+ _pidfile_threads: ta.ClassVar[ta.MutableMapping[Pidfile, threading.Thread]] = {}
27
26
  _num_kills: ta.ClassVar[int] = 0
28
27
 
29
28
  @classmethod
@@ -66,8 +65,8 @@ class _PidfileManager(ForkHook):
66
65
 
67
66
  with cls._lock:
68
67
  cls._pidfile_threads[pf] = threading.current_thread()
69
- try:
70
68
 
69
+ try:
71
70
  with pf:
72
71
  os.set_inheritable(check.not_none(pf.fileno()), True)
73
72
  yield pf
@@ -5,6 +5,7 @@ TODO:
5
5
  - 'json pids', with code version? '.json.pid'? '.jpid'?
6
6
  - json*L* pidfiles - first line is bare int, following may be json - now `head -n1 foo.pid` not cat
7
7
  """
8
+ import errno
8
9
  import fcntl
9
10
  import os
10
11
  import signal
@@ -68,6 +69,7 @@ class Pidfile:
68
69
  if hasattr(self, '_fd_to_dup'):
69
70
  fd = os.dup(self._fd_to_dup)
70
71
  del self._fd_to_dup
72
+
71
73
  else:
72
74
  ofl = os.O_RDWR
73
75
  if not self._no_create:
@@ -80,11 +82,8 @@ class Pidfile:
80
82
 
81
83
  f = os.fdopen(fd, 'r+')
82
84
 
83
- except Exception:
84
- try:
85
- os.close(fd)
86
- except Exception: # noqa
87
- pass
85
+ except BaseException:
86
+ os.close(fd)
88
87
  raise
89
88
 
90
89
  self._f = f
@@ -129,8 +128,11 @@ class Pidfile:
129
128
  fcntl.flock(self._f, fcntl.LOCK_EX | fcntl.LOCK_NB)
130
129
  return True
131
130
 
132
- except OSError:
133
- return False
131
+ except BlockingIOError as e:
132
+ if e.errno == errno.EAGAIN:
133
+ return False
134
+ else:
135
+ raise
134
136
 
135
137
  #
136
138
 
omlish/shlex.py CHANGED
@@ -2,6 +2,9 @@
2
2
  import shlex
3
3
 
4
4
 
5
+ ##
6
+
7
+
5
8
  def shlex_needs_quote(s: str) -> bool:
6
9
  return bool(s) and len(list(shlex.shlex(s))) > 1
7
10
 
omlish/sql/abc.py CHANGED
@@ -5,6 +5,9 @@ import enum
5
5
  import typing as ta
6
6
 
7
7
 
8
+ ##
9
+
10
+
8
11
  DbapiTypeCode: ta.TypeAlias = ta.Any | None
9
12
 
10
13
  DbapiColumnDescription: ta.TypeAlias = tuple[
omlish/sql/dbapi.py CHANGED
@@ -45,6 +45,9 @@ from .. import lang
45
45
  from .params import ParamStyle
46
46
 
47
47
 
48
+ ##
49
+
50
+
48
51
  class DbapiDialect(enum.Enum):
49
52
  SQLITE = 'sqlite'
50
53
  MYSQL = 'mysql'
@@ -3,6 +3,9 @@ import dataclasses as dc
3
3
  import typing as ta
4
4
 
5
5
 
6
+ ##
7
+
8
+
6
9
  @dc.dataclass(frozen=True)
7
10
  class QualifiedName(ta.Sequence[str]):
8
11
  parts: ta.Sequence[str]
@@ -1,6 +1,9 @@
1
1
  import contextlib
2
2
 
3
3
 
4
+ ##
5
+
6
+
4
7
  @contextlib.contextmanager
5
8
  def assert_raises_star(et):
6
9
  num_caught = 0
@@ -8,6 +8,9 @@ import pytest
8
8
  from ... import lang
9
9
 
10
10
 
11
+ ##
12
+
13
+
11
14
  def if_cant_import(module: str, *args, **kwargs):
12
15
  return pytest.mark.skipif(not lang.can_import(module, *args, **kwargs), reason=f'requires import {module}')
13
16
 
omlish/testing/testing.py CHANGED
@@ -7,17 +7,24 @@ import traceback
7
7
  import typing as ta
8
8
 
9
9
 
10
- DEFAULT_TIMEOUT_S = 30
11
-
12
10
  T = ta.TypeVar('T')
13
11
  K = ta.TypeVar('K')
14
12
  V = ta.TypeVar('V')
15
13
 
16
14
 
15
+ ##
16
+
17
+
17
18
  def assert_dicts_equal_ordered(l: ta.Mapping[K, V], r: ta.Mapping[K, V]) -> None:
18
19
  assert list(l.items()) == list(r.items())
19
20
 
20
21
 
22
+ ##
23
+
24
+
25
+ DEFAULT_TIMEOUT_S = 30
26
+
27
+
21
28
  def call_many_with_timeout(
22
29
  fns: ta.Iterable[ta.Callable[[], T]],
23
30
  timeout_s: float | None = None,
@@ -88,6 +95,9 @@ def waitpid_with_timeout(
88
95
  raise timeout_exception
89
96
 
90
97
 
98
+ ##
99
+
100
+
91
101
  def xfail(fn):
92
102
  @functools.wraps(fn)
93
103
  def inner(*args, **kwargs):
omlish/text/delimit.py CHANGED
@@ -6,6 +6,9 @@ import io
6
6
  import typing as ta
7
7
 
8
8
 
9
+ ##
10
+
11
+
9
12
  class DelimitedEscaping:
10
13
  def __init__(
11
14
  self,
omlish/text/glyphsplit.py CHANGED
@@ -12,6 +12,9 @@ import typing as ta
12
12
  from ..lite.check import check
13
13
 
14
14
 
15
+ ##
16
+
17
+
15
18
  @dc.dataclass(frozen=True)
16
19
  class GlyphSplitMatch:
17
20
  l: str
omlish/text/indent.py CHANGED
@@ -7,6 +7,9 @@ import typing as ta
7
7
  from ..lite.check import check
8
8
 
9
9
 
10
+ ##
11
+
12
+
10
13
  class IndentWriter:
11
14
  DEFAULT_INDENT = ' ' * 4
12
15
 
omlish/text/mangle.py CHANGED
@@ -7,6 +7,9 @@ from ..lite.cached import cached_nullary
7
7
  from ..lite.check import check
8
8
 
9
9
 
10
+ ##
11
+
12
+
10
13
  @dc.dataclass(frozen=True)
11
14
  class StringMangler:
12
15
  escape: str
omlish/text/random.py CHANGED
@@ -2,6 +2,9 @@ import random
2
2
  import string
3
3
 
4
4
 
5
+ ##
6
+
7
+
5
8
  def generate_random_text(size: int) -> str:
6
9
  chars = string.ascii_letters + string.digits + string.punctuation
7
10
  return ''.join(random.choices(chars, k=size))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev261
3
+ Version: 0.0.0.dev263
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,18 +1,17 @@
1
1
  omlish/.manifests.json,sha256=x26AIwDzScUvnX-p4xlq6Zc5QYrAo0Vmgf1qHc1KL_M,8253
2
- omlish/__about__.py,sha256=ZHsfTvh2tqA6F3h9CJiRPE2DyXkN-QqoPblX54bfc2A,3380
2
+ omlish/__about__.py,sha256=GOQYEJtlR5EdTLrsRa_QPv0Er_7G_beoO9C_lcsFp6A,3380
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
- omlish/c3.py,sha256=ubu7lHwss5V4UznbejAI0qXhXahrU01MysuHOZI9C4U,8116
4
+ omlish/c3.py,sha256=rer-TPOFDU6fYq_AWio_AmA-ckZ8JDY5shIzQ_yXfzA,8414
5
5
  omlish/cached.py,sha256=MLap_p0rdGoDIMVhXVHm1tsbcWobJF0OanoodV03Ju8,542
6
6
  omlish/check.py,sha256=THqm6jD1a0skAO5EC8SOVg58yq96Vk5wcuruBkCYxyU,2016
7
- omlish/datetimes.py,sha256=HajeM1kBvwlTa-uR1TTZHmZ3zTPnnUr1uGGQhiO1XQ0,2152
8
- omlish/defs.py,sha256=9uUjJuVIbCBL3g14fyzAp-9gH935MFofvlfOGwcBIaM,4913
9
- omlish/dynamic.py,sha256=xQ8LlOt_fUPApg-yz7-gNq8JdVgTqJ0_R6vhJq2WbpI,6522
7
+ omlish/datetimes.py,sha256=iFqCki3MKmBq_ZX-03cW4KE6AsR_pUJCWML2ifBLtdU,2157
8
+ omlish/defs.py,sha256=-4UuZoJUUNO_bZ6eSSdhR4CK4NKN2Wwr1FfUvfTF--8,4918
9
+ omlish/dynamic.py,sha256=zy0oO70_Vlh5dW8Nwav_O9bhIzQ6L16UgSuKR6y43VU,6526
10
10
  omlish/libc.py,sha256=8K4c66YV1ziJerl5poAAYCmsV-VSsHkT3EHhPW04ufg,15639
11
11
  omlish/metadata.py,sha256=HvZ6ItMpEmnE-X2d5Q6J17sBiG_qOyWB8DJrS9RFZpY,3604
12
12
  omlish/runmodule.py,sha256=PWvuAaJ9wQQn6bx9ftEL3_d04DyotNn8dR_twm2pgw0,700
13
- omlish/shlex.py,sha256=bsW2XUD8GiMTUTDefJejZ5AyqT1pTgWMPD0BMoF02jE,248
13
+ omlish/shlex.py,sha256=rlbgHWxjwpkCBRphOPqSIN_KD6qWJMLldNJUILulKT0,253
14
14
  omlish/sync.py,sha256=-2gVJZFl8hvp7jvrnX8GcZVOecqAym6AcyK1QtMR9Ic,2979
15
- omlish/_antlr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
15
  omlish/algorithm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
16
  omlish/algorithm/all.py,sha256=FudUHwoaRLNNmqYM3jhP2Yd2BpmYhNBRPaVZzARMoSc,194
18
17
  omlish/algorithm/distribute.py,sha256=kO60F7HtMF3j-IxuhJdtsfgIR1Vpf1okQfacb4eNukQ,1533
@@ -106,13 +105,13 @@ omlish/asyncs/anyio/streams.py,sha256=gNRAcHR0L8OtNioqKFbq0Z_apYAWKHFipZ2MUBp8Vg
106
105
  omlish/asyncs/anyio/sync.py,sha256=ZmSNhSsEkPwlXThrpefhtVTxw4GJ9F0P-yKyo5vbbSk,1574
107
106
  omlish/asyncs/anyio/utils.py,sha256=X2Rz1DGrCJ0zkt1O5cHoMRaYKTPndBj6dzLhb09mVtE,1672
108
107
  omlish/asyncs/asyncio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
- omlish/asyncs/asyncio/all.py,sha256=EksCHjRQKobiGrxuDW72IaH53WJMs7rdj_ZDBI3iKcg,315
110
- omlish/asyncs/asyncio/asyncio.py,sha256=mDjYNm1cylUhQ8slWXwdPoXasuWfafjzu78GHt2Mdig,2437
108
+ omlish/asyncs/asyncio/all.py,sha256=u2JpMEs-0AJ0Vd8yU10HvWD8rfKxdFfMiwBu2oDeuuQ,313
111
109
  omlish/asyncs/asyncio/channels.py,sha256=X3S951YTjTRDguMSQRlfu74mPuWkNd2ZEUWboLY58-M,1079
112
110
  omlish/asyncs/asyncio/sockets.py,sha256=oZAPeC545MGeSpVj_uQfy-BbzXsXHesjCkJSiuqKmAI,1271
113
111
  omlish/asyncs/asyncio/streams.py,sha256=J_d1hgX4Mx9SfyW4DjOzh91PqzZmjOtiIB95ytF8Ygw,1009
114
112
  omlish/asyncs/asyncio/subprocesses.py,sha256=f30-wi-3n9R5dftm4CMrzp23EEa4GX283bORixm1_UU,6931
115
113
  omlish/asyncs/asyncio/timeouts.py,sha256=LwFx93KSrefBobQoK4-yH5B6M-pbd7NdNksNzLBfLgQ,459
114
+ omlish/asyncs/asyncio/utils.py,sha256=mDjYNm1cylUhQ8slWXwdPoXasuWfafjzu78GHt2Mdig,2437
116
115
  omlish/asyncs/bluelet/LICENSE,sha256=VHf3oPQihOHnWyIR8LcXX0dpONa1lgyJnjWC2qVuRR0,559
117
116
  omlish/asyncs/bluelet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
118
117
  omlish/asyncs/bluelet/all.py,sha256=aUV6PwnR8DqnEBS9wsZuPW_UtP6G9M8_KY-mmxZeVG0,1516
@@ -292,6 +291,7 @@ omlish/formats/json/stream/errors.py,sha256=c8M8UAYmIZ-vWZLeKD2jMj4EDCJbr9QR8Jq_
292
291
  omlish/formats/json/stream/lex.py,sha256=ItsWvtl5SZH-HwQtPy8Cpf4nszqDzvUTdIOEmSRiZ-E,6807
293
292
  omlish/formats/json/stream/parse.py,sha256=JuYmXwtTHmQJTFKoJNoEHUpCPxXdl_gvKPykVXgED34,6208
294
293
  omlish/formats/json/stream/render.py,sha256=NtmDsN92xZi5dkgSSuMeMXMAiJblmjz1arB4Ft7vBhc,3715
294
+ omlish/formats/json/stream/utils.py,sha256=QASlxxQGscktsHrORlt8m9V3VWLDakP01QnsSPHLDQ8,1189
295
295
  omlish/formats/json5/Json5.g4,sha256=ZUmgJPvj8lSMUD_v3wijp10ZQExYB5mu5Q089dYEJSU,2389
296
296
  omlish/formats/json5/__init__.py,sha256=BsjPz5zJDji3GjQ8x8hWvcl1GYPV_ZIHnE3c2Sr8aTU,102
297
297
  omlish/formats/json5/codec.py,sha256=ldnxCRo0JP1fkGLt0mMxJlLvNxqIF_1KUCcSp1HtI-M,452
@@ -408,7 +408,7 @@ omlish/iterators/iterators.py,sha256=iTQQwBE6Wzoy36dnbPIws17zbjE3zNN4KwVw4Fzh-gY
408
408
  omlish/iterators/recipes.py,sha256=53mkexitMhkwXQZbL6DrhpT0WePQ_56uXd5Jaw3DfzI,467
409
409
  omlish/iterators/tools.py,sha256=Pi4ybXytUXVZ3xwK89xpPImQfYYId9p1vIFQvVqVLqA,2551
410
410
  omlish/iterators/unique.py,sha256=0jAX3kwzVfRNhe0Tmh7kVP_Q2WBIn8POo_O-rgFV0rQ,1390
411
- omlish/lang/__init__.py,sha256=H-kPgztXCiOneAvYeC1YxN8nMQu_gYBY2hwy8-dxHvs,5064
411
+ omlish/lang/__init__.py,sha256=OUR1wf7Syr8VdQwSJd9_92m-b6Gm4O11dqm92NnsC8s,5076
412
412
  omlish/lang/attrs.py,sha256=fofCKN0X8TMu1yGqHpLpNLih9r9HWl3D3Vn3b6O791w,3891
413
413
  omlish/lang/clsdct.py,sha256=HAGIvBSbCefzRjXriwYSBLO7QHKRv2UsE78jixOb-fA,1828
414
414
  omlish/lang/collections.py,sha256=aGi0j6VzVe2nz4l357Y4RD5_XNl8OJbmM5qM6BclrrY,1895
@@ -417,7 +417,7 @@ omlish/lang/contextmanagers.py,sha256=UPH6daYwSP9cH5AfSVsJyEHk1UURMGhVPM5ZRhp_Hv
417
417
  omlish/lang/datetimes.py,sha256=ehI_DhQRM-bDxAavnp470XcekbbXc4Gdw9y1KpHDJT0,223
418
418
  omlish/lang/descriptors.py,sha256=zBtgO9LjdSTGHNUgiIqswh78WOVoGH6KzS0NbgB1Wls,6572
419
419
  omlish/lang/exceptions.py,sha256=qJBo3NU1mOWWm-NhQUHCY5feYXR3arZVyEHinLsmRH4,47
420
- omlish/lang/functions.py,sha256=0ql9EXA_gEEhvUVzMJCjVhEnVtHecsLKmfmAXuQqeGY,4388
420
+ omlish/lang/functions.py,sha256=rrXzGOx4vVLek1_Ga7lHwOxjQy65Uvc0UR5tjJ0c6Xs,4508
421
421
  omlish/lang/generators.py,sha256=5LX17j-Ej3QXhwBgZvRTm_dq3n9veC4IOUcVmvSu2vU,5243
422
422
  omlish/lang/imports.py,sha256=Gdl6xCF89xiMOE1yDmdvKWamLq8HX-XPianO58Jdpmw,9218
423
423
  omlish/lang/iterables.py,sha256=HOjcxOwyI5bBApDLsxRAGGhTTmw7fdZl2kEckxRVl-0,1994
@@ -542,7 +542,7 @@ omlish/os/deathsig.py,sha256=hk9Yq2kyDdI-cI7OQH7mOfpRbOKzY_TfPKEqgrjVYbA,641
542
542
  omlish/os/fcntl.py,sha256=riQf9iEEEIC28lJp8ud06MU56w2XJHJ9nBFtck_hdhc,1501
543
543
  omlish/os/filemodes.py,sha256=ZIk6XpPw2oyoytSsuVmBXQ6fvMDHzctNEDIA2uHTBC4,4575
544
544
  omlish/os/files.py,sha256=WJ_42vsZIZukQURN3TTccp-n74ZNhbux_ps3TLbHj18,1106
545
- omlish/os/forkhooks.py,sha256=yjodOvs90ClXskv5oBIJbHn0Y7dzajLmZmOpRMKbyxM,5656
545
+ omlish/os/forkhooks.py,sha256=STzhEuV7oOegfqlq1DJIhESO1icMzgat0V9m02Ubky8,5668
546
546
  omlish/os/journald.py,sha256=2nI8Res1poXkbLc31--MPUlzYMESnCcPUkIxDOCjZW0,3903
547
547
  omlish/os/linux.py,sha256=whJ6scwMKSFBdXiVhJW0BCpJV4jOGMr-a_a3Bhwz6Ls,18938
548
548
  omlish/os/mangle.py,sha256=M0v-SDt4TMnL68I45GekQrUaXkTIILXIlPdqRxKBTKM,524
@@ -553,12 +553,12 @@ omlish/os/temp.py,sha256=P97KiVeNB7rfGn4tlgU5ro86JUxAsiphLMlxsjQgfB0,1198
553
553
  omlish/os/deathpacts/__init__.py,sha256=IFJkHVWff-VhBbQX38th1RlmjUF2ptKh5TPIzP9Ei2M,229
554
554
  omlish/os/deathpacts/base.py,sha256=EGN3BWSXPv0s9kl_QLrWE31hTybDHCmsLc_w3U2VyHc,1740
555
555
  omlish/os/deathpacts/heartbeatfile.py,sha256=OybdvhM2kxBTuoJWOJJ5LcX-0lg3jTOvvD2HUunxDWU,1731
556
- omlish/os/deathpacts/pipe.py,sha256=ZH-l-fIKyurocCehqOgvaYRurxIEMWe8D7l2dsJeGws,3214
556
+ omlish/os/deathpacts/pipe.py,sha256=mfN2UGsOaEmoh4jHi6D0vnjg420pNsyctb3ZTcNsdqI,3285
557
557
  omlish/os/pidfiles/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
558
558
  omlish/os/pidfiles/__main__.py,sha256=AF8TwjK4xgHVnoLAP9dIWgKvT0vGhHJlfDW0tKZ7tx4,200
559
559
  omlish/os/pidfiles/cli.py,sha256=2SSsP4O3VdpsDIMAkWgWSjh_YNIPzCD9l5LNN2qrIjo,2074
560
- omlish/os/pidfiles/manager.py,sha256=qSEwNaWT1KOAnU0KxliwvU_uowme5jyf1FyIPsGwnTY,2391
561
- omlish/os/pidfiles/pidfile.py,sha256=v0p5NTW8tFv1frCBzgjRkXnljsw8PQ1exfc7kjZJ5L8,4359
560
+ omlish/os/pidfiles/manager.py,sha256=QphQxIENVVwvBWynLCNU31NwOfLkV43VoTVeYFn2Hac,2351
561
+ omlish/os/pidfiles/pidfile.py,sha256=9tI5IMVwfPfnni0XMn4x5ptNQgm36n8tLeUNPf50UqU,4394
562
562
  omlish/os/pidfiles/pinning.py,sha256=v9RlJ4BnJZcaZZXiiRqbmzLluaSOkeeEb_WrbKEClBQ,6643
563
563
  omlish/reflect/__init__.py,sha256=Er2yBHibVO16hFNA1szQF2_f43Y3HRCBWtS-fjsOIYc,798
564
564
  omlish/reflect/inspect.py,sha256=WCo2YpBYauKw6k758FLlZ_H4Q05rgVPs96fEv9w6zHQ,1538
@@ -661,11 +661,11 @@ omlish/specs/proto/_antlr/Protobuf3Parser.py,sha256=VmkUyJx3WxIgAecOa1BGwbO9fVNy
661
661
  omlish/specs/proto/_antlr/Protobuf3Visitor.py,sha256=zEVBXly2k9Cqmgdb45QwpLR-fZCEq8hpp2WQj-s7Wps,8782
662
662
  omlish/specs/proto/_antlr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
663
663
  omlish/sql/__init__.py,sha256=TpZLsEJKJzvJ0eMzuV8hwOJJbkxBCV1RZPUMLAVB6io,173
664
- omlish/sql/abc.py,sha256=yrUSO2OSY6rtMyA0_MlrEFEyIKXLJymSPpmJwEjEJuc,4038
665
- omlish/sql/dbapi.py,sha256=o6umqE7zVFI_ax0TnCKAikhAIPXChYOwVULb_OdcL1c,2974
664
+ omlish/sql/abc.py,sha256=3hrCjB4jnPVMef_YXClCblzYUZ9l9yaxJJdd5_Nu9GM,4043
665
+ omlish/sql/dbapi.py,sha256=DfMxCyltpMj6hUiLti1omUvJyMGbrkGxcz2ywolOpPA,2979
666
666
  omlish/sql/dbs.py,sha256=65e388987upJpsFX8bNL7uhiYv2sCsmk9Y04V0MXdsI,1873
667
667
  omlish/sql/params.py,sha256=Z4VPet6GhNqD1T_MXSWSHkdy3cpUEhST-OplC4B_fYI,4433
668
- omlish/sql/qualifiedname.py,sha256=rlW3gVmyucJbqwcxj_7BfK4X2HoXrMroZT2H45zPgJQ,2264
668
+ omlish/sql/qualifiedname.py,sha256=c3GQzxh9sNyE_TP32PnlCun_F2bKXvX1ohtt6esTsjo,2269
669
669
  omlish/sql/alchemy/__init__.py,sha256=1ruDMiviH5fjevn2xVki-QspcE9O3VPy4hxOqpHjI2s,224
670
670
  omlish/sql/alchemy/asyncs.py,sha256=MwZwWIaZsUCQLcTA8mdHUPZmR-pXEVSAsvd15FCm3W4,3692
671
671
  omlish/sql/alchemy/duckdb.py,sha256=kr7pIhiBLNAuZrcigHDtFg9zHkVcrRW3LfryO9VJ4mk,3749
@@ -727,10 +727,10 @@ omlish/term/vt100/c.py,sha256=cAhDKXI81PZRtFmTotfad3HZGREP1QnOlWYoAw6v-Fw,3532
727
727
  omlish/term/vt100/states.py,sha256=OxPUxfFTcfz56MhtDgIigEApChOtN6XO1g6R2H08mu4,8303
728
728
  omlish/term/vt100/terminal.py,sha256=KUlg331ele7P6SHsBKdbpdQFDKsxSply1Ds27NkppTs,9359
729
729
  omlish/testing/__init__.py,sha256=M_BQrcCHkoL-ZvE-UpQ8XxXNYRRawhjUz4rCJnAqM2A,152
730
- omlish/testing/testing.py,sha256=TT2wwSzPZ_KhIvKxpM1qc1yHKD-LHDNgGrcr_h8vs7c,2895
730
+ omlish/testing/testing.py,sha256=rA5jyo-3q2RLRq1whkoGylWKQ-AYlBwWz6z5s2XtFzo,2911
731
731
  omlish/testing/pytest/__init__.py,sha256=rOpQYgp7jYjEIMjInzl-a_uIMqmOtVwGzDgJyCDpvxg,206
732
- omlish/testing/pytest/helpers.py,sha256=TJpD60mBtLi9FtxX4TThfuXvg5FIRPSiZk1aeRwe-D4,197
733
- omlish/testing/pytest/skip.py,sha256=Mk7iIfXxp6JWl8vJRP9BK9LoirSOLTJ3mLeLL6Ipi9M,984
732
+ omlish/testing/pytest/helpers.py,sha256=HxiKvpJQ4b6WCiQXOqQTqKbmr7CMAgCF6hViT6pfIuw,202
733
+ omlish/testing/pytest/skip.py,sha256=imDrBhQKQkEmStaSn0Js-zsfyKMPmNod-mW1ANdIhak,989
734
734
  omlish/testing/pytest/inject/__init__.py,sha256=pdRKv1HcDmJ_yArKJbYITPXXZthRSGgBJWqITr0Er38,117
735
735
  omlish/testing/pytest/inject/harness.py,sha256=_Qf7lLcYc_dpauYOE68u_a65jPCFWmQUYv9m_OOdNqs,5724
736
736
  omlish/testing/pytest/plugins/__init__.py,sha256=ys1zXrYrNm7Uo6YOIVJ6Bd3dQo6kv387k7MbTYlqZSI,467
@@ -757,20 +757,20 @@ omlish/testing/pytest/plugins/asyncs/backends/trio_asyncio.py,sha256=VcGVwf4V-1Z
757
757
  omlish/text/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
758
758
  omlish/text/asdl.py,sha256=AS3irh-sag5pqyH3beJif78PjCbOaFso1NeKq-HXuTs,16867
759
759
  omlish/text/decoding.py,sha256=sQWGckWzRslRHYKpj1SBeoo6AVqXm5HFlWFRARN1QpM,1286
760
- omlish/text/delimit.py,sha256=Y0ID9Y9nfgQu3tYCiMS3hLa-ugA2cc-29PV4fF1343g,4927
760
+ omlish/text/delimit.py,sha256=z9uIuWJdbp7M3ku2KQRHo-lzJYZUJCqZTLse1sIUI4Q,4932
761
761
  omlish/text/filecache.py,sha256=ls08QSqBlhVXvjDwJpUXiP-U9HLyCstGAxtBOuWJmVY,5414
762
- omlish/text/glyphsplit.py,sha256=kqqjglRdxGo0czYZxOz9Vi8aBmVsCOq8h6lPwRA5xe0,3803
763
- omlish/text/indent.py,sha256=YjtJEBYWuk8--b9JU_T6q4yxV85_TR7VEVr5ViRCFwk,1336
762
+ omlish/text/glyphsplit.py,sha256=HI8TWDUaF_tJG5RnIdIjtUH_lYnjYZ7KZBANSxOXGZc,3808
763
+ omlish/text/indent.py,sha256=LOQgHskHMLVrRC6HLL9uIWay517dpvPEYQK0Igm-wm8,1341
764
764
  omlish/text/linecache.py,sha256=hRYlEhD63ZfA6_ZOTkQIcnON-3W56QMAhcG3vEJqj9M,1858
765
- omlish/text/mangle.py,sha256=kfzFLfvepH-chl1P89_mdc5vC4FSqyPA2aVtgzuB8IY,1133
765
+ omlish/text/mangle.py,sha256=yBSEWZfmcMBbGP8Ynb7JKldQMLG-8cNV5F-rBMGg6VE,1138
766
766
  omlish/text/minja.py,sha256=jZC-fp3Xuhx48ppqsf2Sf1pHbC0t8XBB7UpUUoOk2Qw,5751
767
767
  omlish/text/parts.py,sha256=Q9NvoyEGQKIWgiPD4D_Qc66cWAuyEKE033dT9m7c3Wk,6662
768
- omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
768
+ omlish/text/random.py,sha256=8feS5JE_tSjYlMl-lp0j93kCfzBae9AM2cXlRLebXMA,199
769
769
  omlish/text/go/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
770
770
  omlish/text/go/quoting.py,sha256=N9EYdnFdEX_A8fOviH-1w4jwV3XOQ7VU2WsoUNubYVY,9137
771
- omlish-0.0.0.dev261.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
772
- omlish-0.0.0.dev261.dist-info/METADATA,sha256=O7gGUkhbgsi0XRUcwynTYxv1lgYqSKk6-UQI4Y9hCkQ,4198
773
- omlish-0.0.0.dev261.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
774
- omlish-0.0.0.dev261.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
775
- omlish-0.0.0.dev261.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
776
- omlish-0.0.0.dev261.dist-info/RECORD,,
771
+ omlish-0.0.0.dev263.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
772
+ omlish-0.0.0.dev263.dist-info/METADATA,sha256=WzqhQvPspAtdhpJVn5vOwEXuIdEDvkPu0IfVoqfLArw,4198
773
+ omlish-0.0.0.dev263.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
774
+ omlish-0.0.0.dev263.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
775
+ omlish-0.0.0.dev263.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
776
+ omlish-0.0.0.dev263.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (77.0.3)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
omlish/_antlr/__init__.py DELETED
File without changes
File without changes