omlish 0.0.0.dev301__py3-none-any.whl → 0.0.0.dev303__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.dev301'
2
- __revision__ = '1567cf674d01bddcf7c1ad426e2677fe25730bd0'
1
+ __version__ = '0.0.0.dev303'
2
+ __revision__ = '8c675f0f9a5c459eddf54867184cd1da05cff6ac'
3
3
 
4
4
 
5
5
  #
@@ -54,8 +54,8 @@ def staple_memory_object_stream(
54
54
  ) -> MemoryStapledObjectStream[T]:
55
55
  send, receive = args
56
56
  return MemoryStapledObjectStream(
57
- check.isinstance(send, MemoryObjectSendStream), # type: ignore
58
- check.isinstance(receive, MemoryObjectReceiveStream), # type: ignore
57
+ check.isinstance(send, MemoryObjectSendStream),
58
+ check.isinstance(receive, MemoryObjectReceiveStream),
59
59
  )
60
60
 
61
61
 
@@ -64,6 +64,6 @@ def staple_memory_object_stream(
64
64
  def staple_memory_object_stream2[T](max_buffer_size: float = 0) -> MemoryStapledObjectStream[T]:
65
65
  send, receive = anyio.create_memory_object_stream[T](max_buffer_size)
66
66
  return MemoryStapledObjectStream(
67
- check.isinstance(send, MemoryObjectSendStream), # type: ignore
68
- check.isinstance(receive, MemoryObjectReceiveStream), # type: ignore
67
+ check.isinstance(send, MemoryObjectSendStream),
68
+ check.isinstance(receive, MemoryObjectReceiveStream),
69
69
  )
omlish/asyncs/bridge.py CHANGED
@@ -1,10 +1,21 @@
1
1
  """
2
- https://github.com/kubernetes/kubernetes/blob/60c4c2b2521fb454ce69dee737e3eb91a25e0535/pkg/controller/volume/persistentvolume/pv_controller.go#L60-L63
2
+ A system for bridging sync and async code. Supports nesting / reentrancy. Robust, but not the most efficient
3
+ implementation - its primary usecase are heavy and init-time ops like lock management and connection establishment, not
4
+ so much for packet-level ops.
3
5
 
4
- ==================================================================
5
- PLEASE DO NOT ATTEMPT TO SIMPLIFY THIS CODE.
6
- KEEP THE SPACE SHUTTLE FLYING.
7
- ==================================================================
6
+ ==
7
+
8
+ The code is written in a very dumb, simple, explicit style to keep the bookkeeping center-stage and front-of-mind. To
9
+ quote kubernetes:
10
+
11
+ https://github.com/kubernetes/kubernetes/blob/60c4c2b2521fb454ce69dee737e3eb91a25e0535/pkg/controller/volume/persistentvolume/pv_controller.go#L60-L63
12
+
13
+ ==================================================================
14
+ PLEASE DO NOT ATTEMPT TO SIMPLIFY THIS CODE.
15
+ KEEP THE SPACE SHUTTLE FLYING.
16
+ ==================================================================
17
+
18
+ ==
8
19
 
9
20
  TODO:
10
21
  - reuse greenlet if nested somehow?
@@ -35,7 +35,7 @@ from .base import SimpleBootstrap
35
35
 
36
36
 
37
37
  BOOTSTRAP_TYPES_BY_NAME: ta.Mapping[str, ta.Type[Bootstrap]] = { # noqa
38
- lang.snake_case(cls.__name__[:-len('Bootstrap')]): cls
38
+ lang.snake_case(*lang.split_string_casing(cls.__name__[:-len('Bootstrap')])): cls
39
39
  for cls in lang.deep_subclasses(Bootstrap, concrete_only=True)
40
40
  }
41
41
 
@@ -7,6 +7,9 @@ from ...lite.check import check
7
7
  from ...sockets.addresses import SocketAddress
8
8
 
9
9
 
10
+ ##
11
+
12
+
10
13
  class FdioHandler(abc.ABC):
11
14
  @abc.abstractmethod
12
15
  def fd(self) -> int:
omlish/io/fdio/kqueue.py CHANGED
@@ -7,6 +7,9 @@ import typing as ta
7
7
  from .pollers import FdioPoller
8
8
 
9
9
 
10
+ ##
11
+
12
+
10
13
  KqueueFdioPoller: ta.Optional[ta.Type[FdioPoller]]
11
14
  if sys.platform == 'darwin' or sys.platform.startswith('freebsd'):
12
15
 
omlish/io/fdio/manager.py CHANGED
@@ -5,6 +5,9 @@ from .handlers import FdioHandler
5
5
  from .pollers import FdioPoller
6
6
 
7
7
 
8
+ ##
9
+
10
+
8
11
  class FdioManager:
9
12
  def __init__(
10
13
  self,
omlish/io/trampoline.py CHANGED
@@ -24,8 +24,8 @@ T = ta.TypeVar('T')
24
24
 
25
25
  BytesLike: ta.TypeAlias = ta.Any
26
26
 
27
- BufferedReader = io.BufferedReader
28
- # BufferedReader = pyio.BufferedReader
27
+ BufferedReader: ta.TypeAlias = io.BufferedReader
28
+ # BufferedReader: ta.TypeAlias = pyio.BufferedReader
29
29
 
30
30
 
31
31
  ##
omlish/lang/__init__.py CHANGED
@@ -23,6 +23,33 @@ from .cached.property import ( # noqa
23
23
  cached_property,
24
24
  )
25
25
 
26
+ from .casing import ( # noqa
27
+ StringCasingError,
28
+ ImproperStringCasingError,
29
+ UnknownStringCasingError,
30
+ AmbiguousStringCasingError,
31
+
32
+ StringCasing,
33
+ CamelCase,
34
+ LowCamelCase,
35
+ SnakeCase,
36
+ UpSnakeCase,
37
+
38
+ STRING_CASINGS,
39
+ CAMEL_CASE,
40
+ LOW_CAMEL_CASE,
41
+ SNAKE_CASE,
42
+ UP_SNAKE_CASE,
43
+
44
+ camel_case,
45
+ low_camel_case,
46
+ snake_case,
47
+ up_snake_case,
48
+
49
+ get_string_casing,
50
+ split_string_casing,
51
+ )
52
+
26
53
  from .classes.abstract import ( # noqa
27
54
  Abstract,
28
55
  AbstractTypeError,
@@ -260,7 +287,6 @@ from .strings import ( # noqa
260
287
  BOOL_STRINGS,
261
288
  BOOL_TRUE_STRINGS,
262
289
  STRING_BOOL_VALUES,
263
- camel_case,
264
290
  find_any,
265
291
  indent_lines,
266
292
  is_dunder,
@@ -272,7 +298,6 @@ from .strings import ( # noqa
272
298
  prefix_lines,
273
299
  replace_many,
274
300
  rfind_any,
275
- snake_case,
276
301
  strip_prefix,
277
302
  strip_suffix,
278
303
  )
omlish/lang/casing.py ADDED
@@ -0,0 +1,192 @@
1
+ import abc
2
+ import re
3
+ import typing as ta
4
+
5
+
6
+ ##
7
+
8
+
9
+ class StringCasingError(Exception):
10
+ pass
11
+
12
+
13
+ class ImproperStringCasingError(StringCasingError):
14
+ pass
15
+
16
+
17
+ class UnknownStringCasingError(StringCasingError):
18
+ pass
19
+
20
+
21
+ class AmbiguousStringCasingError(StringCasingError):
22
+ pass
23
+
24
+
25
+ def _check_all_lowercase(*ps: str) -> None:
26
+ for p in ps:
27
+ if p.lower() != p:
28
+ raise ImproperStringCasingError(p)
29
+
30
+
31
+ ##
32
+
33
+
34
+ class StringCasing(abc.ABC):
35
+ @abc.abstractmethod
36
+ def match(self, s: str) -> bool:
37
+ raise NotImplementedError
38
+
39
+ @abc.abstractmethod
40
+ def split(self, s: str) -> list[str]:
41
+ """Returns lowercase."""
42
+
43
+ raise NotImplementedError
44
+
45
+ @abc.abstractmethod
46
+ def join(self, *parts: str) -> str:
47
+ """Expects lowercase."""
48
+
49
+ raise NotImplementedError
50
+
51
+
52
+ #
53
+
54
+
55
+ class CamelCase(StringCasing):
56
+ """FooBarBaz"""
57
+
58
+ _PAT: ta.ClassVar[re.Pattern] = re.compile(r'[A-Z][a-z0-9]*(?:[A-Z][a-z0-9]*)*')
59
+ _SPLIT_PAT: ta.ClassVar[re.Pattern] = re.compile(r'[A-Z][a-z0-9]*')
60
+
61
+ def match(self, s: str) -> bool:
62
+ return bool(self._PAT.fullmatch(s))
63
+
64
+ def split(self, s: str) -> list[str]:
65
+ if not self.match(s):
66
+ raise ImproperStringCasingError(f'Not valid CamelCase: {s!r}')
67
+ return [m.group(0).lower() for m in self._SPLIT_PAT.finditer(s)]
68
+
69
+ def join(self, *parts: str) -> str:
70
+ _check_all_lowercase(*parts)
71
+ return ''.join(p.capitalize() for p in parts)
72
+
73
+
74
+ #
75
+
76
+
77
+ class LowCamelCase(StringCasing):
78
+ """fooBarBaz"""
79
+
80
+ _MATCH_PAT: ta.ClassVar[re.Pattern] = re.compile(r'[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*)*')
81
+ _SPLIT_PAT: ta.ClassVar[re.Pattern] = re.compile(r'^[a-z0-9]+')
82
+ _UPPER_PAT: ta.ClassVar[re.Pattern] = re.compile(r'[A-Z][a-z0-9]*')
83
+
84
+ def match(self, s: str) -> bool:
85
+ return bool(self._MATCH_PAT.fullmatch(s))
86
+
87
+ def split(self, s: str) -> list[str]:
88
+ if not self.match(s):
89
+ raise ImproperStringCasingError(f'Not valid lowCamelCase: {s!r}')
90
+ parts: list[str] = []
91
+ m0 = self._SPLIT_PAT.match(s)
92
+ if m0:
93
+ parts.append(m0.group(0))
94
+ start = m0.end()
95
+ else:
96
+ start = 0
97
+ for m in self._UPPER_PAT.finditer(s, pos=start):
98
+ parts.append(m.group(0))
99
+ return [p.lower() for p in parts]
100
+
101
+ def join(self, *parts: str) -> str:
102
+ _check_all_lowercase(*parts)
103
+ if not parts:
104
+ return ''
105
+ first, *rest = parts
106
+ return first.lower() + ''.join(p.capitalize() for p in rest)
107
+
108
+
109
+ #
110
+
111
+
112
+ class SnakeCase(StringCasing):
113
+ """foo_bar_baz"""
114
+
115
+ _PAT: ta.ClassVar[re.Pattern] = re.compile(r'[a-z0-9]+(?:_[a-z0-9]+)*')
116
+
117
+ def match(self, s: str) -> bool:
118
+ return bool(self._PAT.fullmatch(s))
119
+
120
+ def split(self, s: str) -> list[str]:
121
+ if not self.match(s):
122
+ raise ImproperStringCasingError(f'Not valid snake_case: {s!r}')
123
+ return s.split('_')
124
+
125
+ def join(self, *parts: str) -> str:
126
+ _check_all_lowercase(*parts)
127
+ return '_'.join(p.lower() for p in parts)
128
+
129
+
130
+ #
131
+
132
+
133
+ class UpSnakeCase(StringCasing):
134
+ """FOO_BAR_BAZ"""
135
+
136
+ _PAT: ta.ClassVar[re.Pattern] = re.compile(r'[A-Z0-9]+(?:_[A-Z0-9]+)*')
137
+
138
+ def match(self, s: str) -> bool:
139
+ return bool(self._PAT.fullmatch(s))
140
+
141
+ def split(self, s: str) -> list[str]:
142
+ if not self.match(s):
143
+ raise ImproperStringCasingError(f'Not valid UPPER_SNAKE_CASE: {s!r}')
144
+ return [part.lower() for part in s.split('_')]
145
+
146
+ def join(self, *parts: str) -> str:
147
+ _check_all_lowercase(*parts)
148
+ return '_'.join(p.upper() for p in parts)
149
+
150
+
151
+ ##
152
+
153
+
154
+ STRING_CASINGS = [
155
+ (CAMEL_CASE := CamelCase()),
156
+ (LOW_CAMEL_CASE := LowCamelCase()),
157
+ (SNAKE_CASE := SnakeCase()),
158
+ (UP_SNAKE_CASE := UpSnakeCase()),
159
+ ]
160
+
161
+
162
+ camel_case = CAMEL_CASE.join
163
+ low_camel_case = LOW_CAMEL_CASE.join
164
+ snake_case = SNAKE_CASE.join
165
+ up_snake_case = UP_SNAKE_CASE.join
166
+
167
+
168
+ ##
169
+
170
+
171
+ def get_string_casing(s: str, casings: ta.Iterable[StringCasing] | None = None) -> StringCasing:
172
+ if casings is None:
173
+ casings = STRING_CASINGS
174
+ cs = [c for c in casings if c.match(s)]
175
+ if not cs:
176
+ raise UnknownStringCasingError
177
+ if len(cs) != 1:
178
+ raise AmbiguousStringCasingError
179
+ [c] = cs
180
+ return c
181
+
182
+
183
+ def split_string_casing(s: str, casings: ta.Iterable[StringCasing] | None = None) -> list[str]:
184
+ if casings is None:
185
+ casings = STRING_CASINGS
186
+ ts = {tuple(c.split(s)) for c in casings if c.match(s)}
187
+ if not ts:
188
+ raise UnknownStringCasingError
189
+ if len(ts) != 1:
190
+ raise AmbiguousStringCasingError
191
+ [t] = ts
192
+ return list(t)
@@ -18,7 +18,9 @@ def yield_dict_init(*args: ta.Any, **kwargs: ta.Any) -> ta.Iterable[tuple[ta.Any
18
18
 
19
19
  # Prefer .items() as it's potentially faster.
20
20
  if isinstance(src, collections.abc.Mapping):
21
- yield from src.items()
21
+ # Not yield-from, explicitly enforce 2ple-ness
22
+ for k, v in src.items():
23
+ yield (k, v)
22
24
 
23
25
  # Support keys() duck-typed dict init behavior:
24
26
  # https://docs.python.org/3/library/stdtypes.html#dict
omlish/lang/imports.py CHANGED
@@ -1,6 +1,7 @@
1
1
  """
2
2
  TODO:
3
3
  - proxy_init 'as' alias support - attrs of (src, dst)
4
+ - use importlib.util.resolve_name
4
5
  """
5
6
  import contextlib
6
7
  import functools
@@ -189,6 +190,7 @@ def try_import(spec: str) -> types.ModuleType | None:
189
190
 
190
191
 
191
192
  def resolve_import_name(name: str, package: str | None = None) -> str:
193
+ # FIXME: importlib.util.resolve_name
192
194
  level = 0
193
195
 
194
196
  if name.startswith('.'):
omlish/lang/strings.py CHANGED
@@ -84,23 +84,6 @@ def rfind_any(
84
84
  ##
85
85
 
86
86
 
87
- def camel_case(name: str, *, lower: bool = False) -> str:
88
- if not name:
89
- return ''
90
- s = ''.join(map(str.capitalize, name.split('_'))) # noqa
91
- if lower:
92
- s = s[0].lower() + s[1:]
93
- return s
94
-
95
-
96
- def snake_case(name: str) -> str:
97
- uppers: list[int | None] = [i for i, c in enumerate(name) if c.isupper()]
98
- return '_'.join([name[l:r].lower() for l, r in zip([None, *uppers], [*uppers, None])]).strip('_')
99
-
100
-
101
- ##
102
-
103
-
104
87
  def is_dunder(name: str) -> bool:
105
88
  return (
106
89
  name[:2] == name[-2:] == '__' and
omlish/lite/check.py CHANGED
@@ -143,7 +143,15 @@ class Checks:
143
143
  spec = (object,)
144
144
  return spec
145
145
 
146
- def isinstance(self, v: ta.Any, spec: ta.Union[ta.Type[T], tuple], msg: CheckMessage = None) -> T: # noqa
146
+ @ta.overload
147
+ def isinstance(self, v: ta.Any, spec: ta.Type[T], msg: CheckMessage = None) -> T:
148
+ ...
149
+
150
+ @ta.overload
151
+ def isinstance(self, v: ta.Any, spec: ta.Any, msg: CheckMessage = None) -> ta.Any:
152
+ ...
153
+
154
+ def isinstance(self, v, spec, msg=None):
147
155
  if not isinstance(v, self._unpack_isinstance_spec(spec)):
148
156
  self._raise(
149
157
  TypeError,
@@ -155,7 +163,15 @@ class Checks:
155
163
 
156
164
  return v
157
165
 
158
- def of_isinstance(self, spec: ta.Union[ta.Type[T], tuple], msg: CheckMessage = None) -> ta.Callable[[ta.Any], T]:
166
+ @ta.overload
167
+ def of_isinstance(self, spec: ta.Type[T], msg: CheckMessage = None) -> ta.Callable[[ta.Any], T]:
168
+ ...
169
+
170
+ @ta.overload
171
+ def of_isinstance(self, spec: ta.Any, msg: CheckMessage = None) -> ta.Callable[[ta.Any], ta.Any]:
172
+ ...
173
+
174
+ def of_isinstance(self, spec, msg=None):
159
175
  def inner(v):
160
176
  return self.isinstance(v, self._unpack_isinstance_spec(spec), msg)
161
177
 
omlish/marshal/naming.py CHANGED
@@ -5,6 +5,7 @@ TODO:
5
5
  """
6
6
  import enum
7
7
 
8
+ from .. import check
8
9
  from .. import lang
9
10
  from .base import Option
10
11
 
@@ -16,11 +17,22 @@ class Naming(Option, enum.Enum):
16
17
 
17
18
 
18
19
  def translate_name(n: str, e: Naming) -> str:
20
+ check.non_empty_str(n)
21
+ check.not_equal(set(n), {'_'})
22
+
23
+ n1 = n.lstrip('_')
24
+ pfx = '_' * (len(n) - len(n1))
25
+ n2 = n1.rstrip('_')
26
+ sfx = '_' * (len(n1) - len(n2))
27
+ ps = lang.split_string_casing(n2)
28
+
19
29
  if e is Naming.SNAKE:
20
- return lang.snake_case(n)
21
- if e is Naming.CAMEL:
22
- return lang.camel_case(n)
23
- if e is Naming.LOW_CAMEL:
24
- r = lang.camel_case(n)
25
- return (r[0].lower() + r[1:]) if r else r
26
- raise ValueError(e)
30
+ r = lang.snake_case(*ps)
31
+ elif e is Naming.CAMEL:
32
+ r = lang.camel_case(*ps)
33
+ elif e is Naming.LOW_CAMEL:
34
+ r = lang.low_camel_case(*ps)
35
+ else:
36
+ raise ValueError(e)
37
+
38
+ return pfx + r + sfx
@@ -104,7 +104,7 @@ def _is_actual_number(x: ta.Any) -> bool:
104
104
 
105
105
 
106
106
  def node_type(n: Node) -> str:
107
- return lang.snake_case(type(n).__name__)
107
+ return lang.snake_case(*lang.split_string_casing(type(n).__name__))
108
108
 
109
109
 
110
110
  ##
@@ -1,5 +1,9 @@
1
1
  # ruff: noqa: UP006 UP007
2
2
  # @omlish-lite
3
+ """
4
+ TODO:
5
+ - git var GIT_EDITOR ?
6
+ """
3
7
  import dataclasses as dc
4
8
  import os
5
9
  import tempfile
@@ -16,6 +20,18 @@ from .run import SubprocessRunOutput
16
20
  ##
17
21
 
18
22
 
23
+ DEFAULT_USER_TEXT_EDITOR = 'vi'
24
+
25
+
26
+ def get_user_text_editor(default: ta.Optional[str] = None) -> str:
27
+ if default is None:
28
+ default = DEFAULT_USER_TEXT_EDITOR
29
+ return os.environ.get('EDITOR', default)
30
+
31
+
32
+ ##
33
+
34
+
19
35
  class EditTextWithUserEditor(SubprocessRunnable, ExitStacked):
20
36
  def __init__(self, initial_text: str = '') -> None:
21
37
  super().__init__()
@@ -46,11 +62,10 @@ class EditTextWithUserEditor(SubprocessRunnable, ExitStacked):
46
62
 
47
63
  def make_run(self) -> SubprocessRun:
48
64
  tf = self._temp_file()
49
-
50
- editor = os.environ.get('EDITOR', 'vi')
65
+ ed = get_user_text_editor()
51
66
 
52
67
  return SubprocessRun.of(
53
- editor,
68
+ ed,
54
69
  tf.path,
55
70
  )
56
71
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev301
3
+ Version: 0.0.0.dev303
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=pjGUyLHaoWpPqRP3jz2u1fC1qoRc2lvrEcpU_Ax2tdg,8253
2
- omlish/__about__.py,sha256=vJ9Iq4fdaTwYJYyurCvPlatvCtdn0744GDUZ2_r6sDM,3478
2
+ omlish/__about__.py,sha256=ZtA9R7gsXvmQ5vqquGdnyiA7g3hwkTA_jGG19gRDrkI,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
@@ -90,7 +90,7 @@ omlish/argparse/all.py,sha256=NeeMM5MIebY7XDAHaCxUzeesEoUYwsf5i9PrBUcO1cI,1057
90
90
  omlish/argparse/cli.py,sha256=KftfiN0fBOdybCWoTW4l967r8OrXe_WtjOQWARcHTv0,8746
91
91
  omlish/asyncs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
92
  omlish/asyncs/all.py,sha256=MjW0P9K8XBrw6AaH2X_qD5Y7hEZOF0cktqFv5BDGH-k,649
93
- omlish/asyncs/bridge.py,sha256=oFCqwGY9u9JYB-tee7GS0gjtIFp19rdZD2Z0YPRjj9k,9738
93
+ omlish/asyncs/bridge.py,sha256=QonuN2KgT7sRsmJEgRvLqtubXma9RI2xOs27X5JSQcA,10153
94
94
  omlish/asyncs/buffers.py,sha256=ip9oDRT-XbBDpeAa72osv-TtZXxdF_ggW4lHkGKxCwE,1418
95
95
  omlish/asyncs/flavors.py,sha256=1mNxGNRVmjUHzA13K5ht8vdJv4CLEmzYTQ6BZXr1520,4866
96
96
  omlish/asyncs/sync.py,sha256=qfK8zRMQ0B_huC-6CsMG8vhKB0ktw7Ttq0NnySdWPwQ,2039
@@ -101,7 +101,7 @@ omlish/asyncs/anyio/__init__.py,sha256=AkwRD3XFWmEzBeHV-eAzwpA4F04bl7xyyapigrxMR
101
101
  omlish/asyncs/anyio/backends.py,sha256=jJIymWoiedaEJJm82gvKiJ41EWLQZ-bcyNHpbDpKKi4,1584
102
102
  omlish/asyncs/anyio/futures.py,sha256=Nm1gLerZEnHk-rlsmr0UfK168IWIK6zA8EebZFtoY_E,2052
103
103
  omlish/asyncs/anyio/signals.py,sha256=ySSut5prdnoy0-5Ws5V1M4cC2ON_vY550vU10d2NHk8,893
104
- omlish/asyncs/anyio/streams.py,sha256=gNRAcHR0L8OtNioqKFbq0Z_apYAWKHFipZ2MUBp8Vg0,2228
104
+ omlish/asyncs/anyio/streams.py,sha256=Zum2qd1t3EiH6yzGWFwxFw79m-IH2VY5sTUTiluFfIY,2164
105
105
  omlish/asyncs/anyio/subprocesses.py,sha256=jjMjlcwtIiy-_y-spPn3eTC5dzrqFNSAMTPaIcXH9S8,3002
106
106
  omlish/asyncs/anyio/sync.py,sha256=ZmSNhSsEkPwlXThrpefhtVTxw4GJ9F0P-yKyo5vbbSk,1574
107
107
  omlish/asyncs/anyio/utils.py,sha256=X2Rz1DGrCJ0zkt1O5cHoMRaYKTPndBj6dzLhb09mVtE,1672
@@ -132,7 +132,7 @@ omlish/bootstrap/__init__.py,sha256=-Rtsg7uPQNhh1dIT9nqrz96XlqizwoLnWf-FwOEstJI,
132
132
  omlish/bootstrap/__main__.py,sha256=4jCwsaogp0FrJjJZ85hzF4-WqluPeheHbfeoKynKvNs,194
133
133
  omlish/bootstrap/base.py,sha256=d8hqn4hp1XMMi5PgcJBQXPKmW47epu8CxBlqDZiRZb4,1073
134
134
  omlish/bootstrap/diag.py,sha256=iemH0nQEHEDzyZztvd_ygGGVpRpgn5UG6naxeQTvXp0,5347
135
- omlish/bootstrap/harness.py,sha256=VW8YP-yENGyXIuJ8GL_xintArF13nafwpz-iAghPt34,1967
135
+ omlish/bootstrap/harness.py,sha256=BMFNTYG03V74WFW5zd6aaxIb6uzGeldiR3VX2alQwlU,1994
136
136
  omlish/bootstrap/main.py,sha256=yZhOHDDlj4xB5a89dRdT8z58FsqqnpoBg1-tvY2CJe4,5903
137
137
  omlish/bootstrap/marshal.py,sha256=mH6KVQILEG7Qb_mULNRe8DGDSZb99mQr9jve4mhqUfc,481
138
138
  omlish/bootstrap/sys.py,sha256=0F0uThMsYdjqUtzrYHr4Xsh_MjscxgWl149i_3tDOqo,8787
@@ -435,7 +435,7 @@ omlish/io/abc.py,sha256=M40QB2udYpCEqmlxCcHv6FlJYJY6ymmJQBlaklYv0U8,1256
435
435
  omlish/io/buffers.py,sha256=9PcGefTq4Lj-qGQK4-fI67SLRBHZ-OkiY3x2pU38-e0,7279
436
436
  omlish/io/fileno.py,sha256=QiVuRfqJRqP1aoLS82AVHOo_rt0lijZHfM21s42uaTo,174
437
437
  omlish/io/pyio.py,sha256=q4RBFVpBE5PYjnGPGT-_4pcZb7dFJmLJ4LtI8OoDRQY,95433
438
- omlish/io/trampoline.py,sha256=oUKTQg1F5xQS1431Kt7MbK-NZpX509ubcXU-s86xJr8,7171
438
+ omlish/io/trampoline.py,sha256=yM7Evz7cgWpFj97IUiHgq9jfqpsx-deTSZwGl1qOnoM,7199
439
439
  omlish/io/compress/__init__.py,sha256=fJFPT4ONfqxmsA4jR6qbMt2woIyyEgnc_qOWK9o1kII,247
440
440
  omlish/io/compress/abc.py,sha256=P9YoQX8XYoq2UfBsinKLUuwwqV1ODUIJzjTraRWGF1M,3090
441
441
  omlish/io/compress/adapters.py,sha256=LJHhjwMHXstoLyX_q0QhGoBAcqyYGWfzhzQbGBXHzHY,6148
@@ -455,19 +455,20 @@ omlish/io/coro/direct.py,sha256=Y--rP3wvBAYMeYctokb5IGd8UyQGmEFChyKISmRg5k0,294
455
455
  omlish/io/coro/readers.py,sha256=9VcXuBQ7BSoFen8UVuYFwnl2jJVjyilWV7QeqLNQtKU,4131
456
456
  omlish/io/coro/stepped.py,sha256=eAppRniUZ00rk3goWLU4zsd52MhZB2_YrOmFqs3RfR4,4929
457
457
  omlish/io/fdio/__init__.py,sha256=XJMieft-Z-JEkpeARn0M1Jj7HYCjRHwfs2QfE8gdzQs,137
458
- omlish/io/fdio/handlers.py,sha256=VDPEff3yXPnCj2jZEkrzuI42bKC8wD8fLmOG97hKrgo,1350
459
- omlish/io/fdio/kqueue.py,sha256=YgGBQibkAUYODYDiGl7Enjtx1oQsJXuDsBLBXgqlLQw,3832
460
- omlish/io/fdio/manager.py,sha256=q4wWf7nKrNtjx6yPEvrVnFt4UtK_BTvVlquEGw7poEo,1250
458
+ omlish/io/fdio/handlers.py,sha256=3Rowi_XVBA0tiE6JM5xdYLB-8n-PFsj2fXeOZipRyC8,1355
459
+ omlish/io/fdio/kqueue.py,sha256=g1azm74GkVeylGwktYoZ2QbSO0wO-47IZ3080lGRom8,3837
460
+ omlish/io/fdio/manager.py,sha256=hi84vQs7-CWp4BLckWv5b89dHxF-IilqVpTI2xC1Q2s,1255
461
461
  omlish/io/fdio/pollers.py,sha256=yNadAt3W5wd90PFmd3vD77bq5QwoVb2A6SM2JjZpKRs,5507
462
462
  omlish/iterators/__init__.py,sha256=yMavf5FofiS1EU4UFuWPXiFZ03W0H-y7MuMxW8FUaEE,358
463
463
  omlish/iterators/iterators.py,sha256=RxW35yQ5ed8vBQ22IqpDXFx-i5JiLQdp7-pkMZXhJJ8,3159
464
464
  omlish/iterators/recipes.py,sha256=wOwOZg-zWG9Zc3wcAxJFSe2rtavVBYwZOfG09qYEx_4,472
465
465
  omlish/iterators/tools.py,sha256=c4hArZEVV8y9_dFfmRwakusv1cWJLT4MkTkGRjnGN5U,2556
466
466
  omlish/iterators/unique.py,sha256=Nw0pSaNEcHAkve0ugfLPvJcirDOn9ECyC5wIL8JlJKI,1395
467
- omlish/lang/__init__.py,sha256=KCzbT9IMWi2TNldAlDZ6b8Rr-7hyV9Ne6kIKJLXNAxg,5315
467
+ omlish/lang/__init__.py,sha256=1m2Kc4CBk_C_B7ydPcGWTdCY00JRMrGtX_RlFvyVTo8,5729
468
468
  omlish/lang/attrs.py,sha256=i7euRF81uNF8QDmUVXSK_BtqLGshaMi4VVdUnMjiMwg,5050
469
+ omlish/lang/casing.py,sha256=hMnWMBv-yP4tr8Rc9_An9IgcAsbtVcEb2D_7n8TaFgw,4636
469
470
  omlish/lang/clsdct.py,sha256=HAGIvBSbCefzRjXriwYSBLO7QHKRv2UsE78jixOb-fA,1828
470
- omlish/lang/collections.py,sha256=jWjtYb2NuhaceQYcn7VS2XRkAaBxIRRTFkOcdvLytKs,2375
471
+ omlish/lang/collections.py,sha256=LVm0Sory60IXyFzYhhO8BZAWy_z_pjiA-meXNlSJP7o,2465
471
472
  omlish/lang/comparison.py,sha256=MOwEG0Yny-jBPHO9kQto9FSRyeNpQW24UABsghkrHxY,1356
472
473
  omlish/lang/contextmanagers.py,sha256=pN8X4ZCagqU9_xWumi8gZPdMIWlInA-_zQrkl7o5VP0,7258
473
474
  omlish/lang/datetimes.py,sha256=mrTtA67JYpfQwSlzdPcBtvm6dAyYM_dXNnlxFwFQH0M,228
@@ -475,7 +476,7 @@ omlish/lang/descriptors.py,sha256=zBtgO9LjdSTGHNUgiIqswh78WOVoGH6KzS0NbgB1Wls,65
475
476
  omlish/lang/enums.py,sha256=F9tflHfaAoV2MpyuhZzpfX9-H55M3zNa9hCszsngEo8,111
476
477
  omlish/lang/functions.py,sha256=51CoKtH_-CXUsKvtCexaR3OLZOtIwSdv4f4DtGBZdpA,6029
477
478
  omlish/lang/generators.py,sha256=5tbjVAywiZH6oAdj1sJLRMtIkC9y3rAkecLT7Z3m7_g,5251
478
- omlish/lang/imports.py,sha256=aC1u2eTrxHhhxShKbJvXswe3aJ7K76vT4YK8LrsvRWU,10476
479
+ omlish/lang/imports.py,sha256=y9W9Y-d_cQ35QCLuSIPoa6vnEqSErFCz8b-34IH128U,10552
479
480
  omlish/lang/iterables.py,sha256=HOjcxOwyI5bBApDLsxRAGGhTTmw7fdZl2kEckxRVl-0,1994
480
481
  omlish/lang/maybes.py,sha256=pb1YrxmpXy-hWKmWR89GxXqZq1MoUD1uuTaTX30peh0,3697
481
482
  omlish/lang/objects.py,sha256=q1T26cxLkejU5XMl5iEVC9IIhjib0VBpe7JCo2bz2Ws,5411
@@ -483,7 +484,7 @@ omlish/lang/outcomes.py,sha256=mpFy_VoM-b74L1aCFsjsZVUHx_icZ1AHMOKeVesjOp4,8628
483
484
  omlish/lang/params.py,sha256=QmNVBfJsfxjDG5ilDPgHV7sK4UwRztkSQdLTo0umb8I,6648
484
485
  omlish/lang/resolving.py,sha256=ei9LDyJexsMMHB9z8diUkNmynWhd_da7h7TqrMYM6lA,1611
485
486
  omlish/lang/resources.py,sha256=WKkAddC3ctMK1bvGw-elGe8ZxAj2IaUTKVSu2nfgHTo,2839
486
- omlish/lang/strings.py,sha256=egdv8PxLNG40-5V93agP5j2rBUDIsahCx048zV7uEbU,4690
487
+ omlish/lang/strings.py,sha256=kJmRFd1D36xXcjd9MdB12BCwF_-MVhNr-TpWj7hMi_4,4252
487
488
  omlish/lang/sys.py,sha256=b4qOPiJZQru_mbb04FNfOjYWUxlV2becZOoc-yya_rQ,411
488
489
  omlish/lang/typing.py,sha256=Zdad9Zv0sa-hIaUXPrzPidT7sDVpRcussAI7D-j-I1c,3296
489
490
  omlish/lang/cached/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -504,7 +505,7 @@ omlish/lifecycles/states.py,sha256=zqMOU2ZU-MDNnWuwauM3_anIAiXM8LoBDElDEraptFg,1
504
505
  omlish/lifecycles/transitions.py,sha256=qQtFby-h4VzbvgaUqT2NnbNumlcOx9FVVADP9t83xj4,1939
505
506
  omlish/lite/__init__.py,sha256=ISLhM4q0LR1XXTCaHdZOZxBRyIsoZqYm4u0bf1BPcVk,148
506
507
  omlish/lite/cached.py,sha256=O7ozcoDNFm1Hg2wtpHEqYSp_i_nCLNOP6Ueq_Uk-7mU,1300
507
- omlish/lite/check.py,sha256=OLwtE2x6nlbGx4vS3Rda7zMHpgqzDSLJminTAX2lqLA,13529
508
+ omlish/lite/check.py,sha256=d3622_iX19iAL-B9QtucLbAt7Z0cZAvJEHOJBVhg3Og,13886
508
509
  omlish/lite/configs.py,sha256=Ev_19sbII67pTWzInYjYqa9VyTiZBvyjhZqyG8TtufE,908
509
510
  omlish/lite/contextmanagers.py,sha256=WrL2NPT7OA5JvHp4H-opwsCpYTHod27EJ4qB1cJ9Mjc,5691
510
511
  omlish/lite/dataclasses.py,sha256=t1G5-xOuvE6o6w9RyqHzLT9wHD0HkqBh5P8HUZWxGzs,1912
@@ -550,7 +551,7 @@ omlish/marshal/base.py,sha256=Q0ZRsz5z0NTI6PeWPc9mdMstJryDDbeIAdpKH9-SDps,11427
550
551
  omlish/marshal/errors.py,sha256=g5XJyTHd__8lfwQ4KwgK-E5WR6MoNTMrqKP2U_QRQQQ,307
551
552
  omlish/marshal/factories.py,sha256=Q926jSVjaQLEmStnHLhm_c_vqEysN1LnDCwAsFLIzXw,2970
552
553
  omlish/marshal/global_.py,sha256=sdBC6PbP77iUAYZ9GIYyAFrbmg14bp6iU3f1l5tpOSE,1378
553
- omlish/marshal/naming.py,sha256=lIklR_Od4x1ghltAgOzqcKhHs-leeSv2YmFhCHO7GIs,613
554
+ omlish/marshal/naming.py,sha256=7jQ204u_Kpc3-OGr-ctUHSv997DdWYRLh643qLHJhks,852
554
555
  omlish/marshal/proxy.py,sha256=puKJpwPpuDlMOIrKMcLTRLJyMiL6n_Xs-p59AuDEymA,543
555
556
  omlish/marshal/registries.py,sha256=FvC6qXHCizNB2QmU_N3orxW7iqfGYkiUXYYdTRWS6HA,2353
556
557
  omlish/marshal/standard.py,sha256=TADR75Hd9VSUpuN_Tnu74Bzmvby42P2bzwFwUBC0l-Q,4283
@@ -679,7 +680,7 @@ omlish/specs/jmespath/functions.py,sha256=YnuwlgkcbUJWlqOvSpN3LGXZpF0fpImKa--FLk
679
680
  omlish/specs/jmespath/lexer.py,sha256=WGxkwQe_dcHWcJcGg9q6K-8_Q0oRdWkw09dYGFNTHbk,12639
680
681
  omlish/specs/jmespath/parser.py,sha256=yfkydotVR4LBhrUTsptL_kLYDoGZrRN9zSEs_76kvZM,24441
681
682
  omlish/specs/jmespath/scope.py,sha256=UyDsl9rv_c8DCjJBuVIA2ESu1jrgYvuwEKiaJDQKnT0,1590
682
- omlish/specs/jmespath/visitor.py,sha256=4jCK_WDf7mBwxAZY2AKAcLOJICQZCSL7Gny8-IplicA,16565
683
+ omlish/specs/jmespath/visitor.py,sha256=HVro_6aBGL0CMBy8NRy6vJzWgwsHGB1qJXldX8H7wSg,16592
683
684
  omlish/specs/jsonrpc/__init__.py,sha256=QQwr-jkgvwr1ZMlNwl5W1TuHcxx8RuzQVFwWwNhp5sM,515
684
685
  omlish/specs/jsonrpc/errors.py,sha256=-Zgmlo6bV6J8w5f8h9axQgLquIFBHDgIwcpufEH5NsE,707
685
686
  omlish/specs/jsonrpc/marshal.py,sha256=HM736piPGnBZrg8CMLDX-L5fZpegyF6l6JUjzLoSDtk,1852
@@ -779,7 +780,7 @@ omlish/sql/tabledefs/tabledefs.py,sha256=lIhvlt0pk6G7RZAtDFsFXm5j0l9BvRfnP7vNGey
779
780
  omlish/subprocesses/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
780
781
  omlish/subprocesses/async_.py,sha256=hPQTWFa3k5CE_s9p1JTY4KdTPOsqLJtq3lGMRznrVpY,2373
781
782
  omlish/subprocesses/base.py,sha256=W6El-PUKKF9KLAks5LB6kzqs_n3FfkblJ-JOv6NFQbY,6133
782
- omlish/subprocesses/editor.py,sha256=nLrudPayAZxv0u5LtZFecR_zdSEk0bd8G3XFjbOD81M,2386
783
+ omlish/subprocesses/editor.py,sha256=tVU1EQsEhCM242HheylQvEsqaAZYnT61kMhlzZcdk5U,2628
783
784
  omlish/subprocesses/run.py,sha256=3jwSnQJvFMDMHmJvtAkrrK5D-i7_8cw12vX84EWTuJo,3668
784
785
  omlish/subprocesses/sync.py,sha256=HKmKM99_Y7tkJRg_n5onXrw41IZt5M5fqU0281LY-mo,3671
785
786
  omlish/subprocesses/utils.py,sha256=MJb6hvKhZceTmBeFVqlc5oM7rDxWkUzSzK9nKvbIvM8,396
@@ -843,9 +844,9 @@ omlish/typedvalues/holder.py,sha256=ZTnHiw-K38ciOBLEdwgrltr7Xp8jjEs_0Lp69DH-G-o,
843
844
  omlish/typedvalues/marshal.py,sha256=hWHRLcrGav7lvXJDtb9bNI0ickl4SKPQ6F4BbTpqw3A,4219
844
845
  omlish/typedvalues/reflect.py,sha256=Ih1YgU-srUjsvBn_P7C66f73_VCvcwqE3ffeBnZBgt4,674
845
846
  omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
846
- omlish-0.0.0.dev301.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
847
- omlish-0.0.0.dev301.dist-info/METADATA,sha256=73kzCdAhnn8paBBMQjS6yxdB4_ViWVxW2Q5r7nOe6LU,4416
848
- omlish-0.0.0.dev301.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
849
- omlish-0.0.0.dev301.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
850
- omlish-0.0.0.dev301.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
851
- omlish-0.0.0.dev301.dist-info/RECORD,,
847
+ omlish-0.0.0.dev303.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
848
+ omlish-0.0.0.dev303.dist-info/METADATA,sha256=Oe8ylkuWV_TTJtgQkuyG97boKvpRe_Z0O8At2xQ97SU,4416
849
+ omlish-0.0.0.dev303.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
850
+ omlish-0.0.0.dev303.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
851
+ omlish-0.0.0.dev303.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
852
+ omlish-0.0.0.dev303.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (79.0.1)
2
+ Generator: setuptools (80.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5