omlish 0.0.0.dev148__py3-none-any.whl → 0.0.0.dev149__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev148'
2
- __revision__ = '01263e3c2d1b82ca19c3d1d6916041ca4276737b'
1
+ __version__ = '0.0.0.dev149'
2
+ __revision__ = '78e7c7e35dc2bc806db7fd199c1ce42b0f41cbe8'
3
3
 
4
4
 
5
5
  #
omlish/argparse/all.py ADDED
@@ -0,0 +1,45 @@
1
+ # ruff: noqa: I001
2
+ import argparse
3
+
4
+ from .cli import ( # noqa
5
+ ArgparseArg as Arg,
6
+ argparse_arg as arg,
7
+
8
+ ArgparseCommandFn as CommandFn,
9
+ ArgparseCommand as Command,
10
+ argparse_command as command,
11
+
12
+ ArgparseCli as Cli,
13
+ )
14
+
15
+
16
+ ##
17
+
18
+
19
+ SUPPRESS = argparse.SUPPRESS
20
+
21
+ OPTIONAL = argparse.OPTIONAL
22
+ ZERO_OR_MORE = argparse.ZERO_OR_MORE
23
+ ONE_OR_MORE = argparse.ONE_OR_MORE
24
+ PARSER = argparse.PARSER
25
+ REMAINDER = argparse.REMAINDER
26
+
27
+ HelpFormatter = argparse.HelpFormatter
28
+ RawDescriptionHelpFormatter = argparse.RawDescriptionHelpFormatter
29
+ RawTextHelpFormatter = argparse.RawTextHelpFormatter
30
+ ArgumentDefaultsHelpFormatter = argparse.ArgumentDefaultsHelpFormatter
31
+
32
+ MetavarTypeHelpFormatter = argparse.MetavarTypeHelpFormatter
33
+
34
+ ArgumentError = argparse.ArgumentError
35
+ ArgumentTypeError = argparse.ArgumentTypeError
36
+
37
+ Action = argparse.Action
38
+ BooleanOptionalAction = argparse.BooleanOptionalAction
39
+ SubParsersAction = argparse._SubParsersAction # noqa
40
+
41
+ FileType = argparse.FileType
42
+
43
+ Namespace = argparse.Namespace
44
+
45
+ ArgumentParser = argparse.ArgumentParser
@@ -1,3 +1,5 @@
1
+ # ruff: noqa: UP006 UP007
2
+ # @omlish-lite
1
3
  """
2
4
  TODO:
3
5
  - default command
@@ -9,8 +11,11 @@ import functools
9
11
  import sys
10
12
  import typing as ta
11
13
 
12
- from . import c3
13
- from . import check
14
+ from ..lite.check import check_arg
15
+ from ..lite.check import check_isinstance
16
+ from ..lite.check import check_not_empty
17
+ from ..lite.check import check_not_in
18
+ from ..lite.check import check_not_isinstance
14
19
 
15
20
 
16
21
  T = ta.TypeVar('T')
@@ -19,43 +24,11 @@ T = ta.TypeVar('T')
19
24
  ##
20
25
 
21
26
 
22
- SUPPRESS = argparse.SUPPRESS
23
-
24
- OPTIONAL = argparse.OPTIONAL
25
- ZERO_OR_MORE = argparse.ZERO_OR_MORE
26
- ONE_OR_MORE = argparse.ONE_OR_MORE
27
- PARSER = argparse.PARSER
28
- REMAINDER = argparse.REMAINDER
29
-
30
- HelpFormatter = argparse.HelpFormatter
31
- RawDescriptionHelpFormatter = argparse.RawDescriptionHelpFormatter
32
- RawTextHelpFormatter = argparse.RawTextHelpFormatter
33
- ArgumentDefaultsHelpFormatter = argparse.ArgumentDefaultsHelpFormatter
34
-
35
- MetavarTypeHelpFormatter = argparse.MetavarTypeHelpFormatter
36
-
37
- ArgumentError = argparse.ArgumentError
38
- ArgumentTypeError = argparse.ArgumentTypeError
39
-
40
- Action = argparse.Action
41
- BooleanOptionalAction = argparse.BooleanOptionalAction
42
- SubParsersAction = argparse._SubParsersAction # noqa
43
-
44
- FileType = argparse.FileType
45
-
46
- Namespace = argparse.Namespace
47
-
48
- ArgumentParser = argparse.ArgumentParser
49
-
50
-
51
- ##
52
-
53
-
54
27
  @dc.dataclass(eq=False)
55
- class Arg:
28
+ class ArgparseArg:
56
29
  args: ta.Sequence[ta.Any]
57
30
  kwargs: ta.Mapping[str, ta.Any]
58
- dest: str | None = None
31
+ dest: ta.Optional[str] = None
59
32
 
60
33
  def __get__(self, instance, owner=None):
61
34
  if instance is None:
@@ -63,42 +36,42 @@ class Arg:
63
36
  return getattr(instance.args, self.dest) # type: ignore
64
37
 
65
38
 
66
- def arg(*args, **kwargs) -> Arg:
67
- return Arg(args, kwargs)
39
+ def argparse_arg(*args, **kwargs) -> ArgparseArg:
40
+ return ArgparseArg(args, kwargs)
68
41
 
69
42
 
70
43
  #
71
44
 
72
45
 
73
- CommandFn = ta.Callable[[], int | None]
46
+ ArgparseCommandFn = ta.Callable[[], ta.Optional[int]] # ta.TypeAlias
74
47
 
75
48
 
76
49
  @dc.dataclass(eq=False)
77
- class Command:
50
+ class ArgparseCommand:
78
51
  name: str
79
- fn: CommandFn
80
- args: ta.Sequence[Arg] = () # noqa
52
+ fn: ArgparseCommandFn
53
+ args: ta.Sequence[ArgparseArg] = () # noqa
81
54
 
82
- _: dc.KW_ONLY
55
+ # _: dc.KW_ONLY
83
56
 
84
- aliases: ta.Sequence[str] | None = None
85
- parent: ta.Optional['Command'] = None
57
+ aliases: ta.Optional[ta.Sequence[str]] = None
58
+ parent: ta.Optional['ArgparseCommand'] = None
86
59
  accepts_unknown: bool = False
87
60
 
88
61
  def __post_init__(self) -> None:
89
62
  def check_name(s: str) -> None:
90
- check.isinstance(s, str)
91
- check.not_in('_', s)
92
- check.not_empty(s)
63
+ check_isinstance(s, str)
64
+ check_not_in('_', s)
65
+ check_not_empty(s)
93
66
  check_name(self.name)
94
- check.not_isinstance(self.aliases, str)
67
+ check_not_isinstance(self.aliases, str)
95
68
  for a in self.aliases or []:
96
69
  check_name(a)
97
70
 
98
- check.callable(self.fn)
99
- check.arg(all(isinstance(a, Arg) for a in self.args))
100
- check.isinstance(self.parent, (Command, None))
101
- check.isinstance(self.accepts_unknown, bool)
71
+ check_arg(callable(self.fn))
72
+ check_arg(all(isinstance(a, ArgparseArg) for a in self.args))
73
+ check_isinstance(self.parent, (ArgparseCommand, type(None)))
74
+ check_isinstance(self.accepts_unknown, bool)
102
75
 
103
76
  functools.update_wrapper(self, self.fn)
104
77
 
@@ -107,25 +80,25 @@ class Command:
107
80
  return self
108
81
  return dc.replace(self, fn=self.fn.__get__(instance, owner)) # noqa
109
82
 
110
- def __call__(self, *args, **kwargs) -> int | None:
83
+ def __call__(self, *args, **kwargs) -> ta.Optional[int]:
111
84
  return self.fn(*args, **kwargs)
112
85
 
113
86
 
114
- def command(
115
- *args: Arg,
116
- name: str | None = None,
117
- aliases: ta.Iterable[str] | None = None,
118
- parent: Command | None = None,
87
+ def argparse_command(
88
+ *args: ArgparseArg,
89
+ name: ta.Optional[str] = None,
90
+ aliases: ta.Optional[ta.Iterable[str]] = None,
91
+ parent: ta.Optional[ArgparseCommand] = None,
119
92
  accepts_unknown: bool = False,
120
- ) -> ta.Any: # ta.Callable[[CommandFn], Command]: # FIXME
93
+ ) -> ta.Any: # ta.Callable[[ArgparseCommandFn], ArgparseCommand]: # FIXME
121
94
  for arg in args:
122
- check.isinstance(arg, Arg)
123
- check.isinstance(name, (str, None))
124
- check.isinstance(parent, (Command, None))
125
- check.not_isinstance(aliases, str)
95
+ check_isinstance(arg, ArgparseArg)
96
+ check_isinstance(name, (str, type(None)))
97
+ check_isinstance(parent, (ArgparseCommand, type(None)))
98
+ check_not_isinstance(aliases, str)
126
99
 
127
100
  def inner(fn):
128
- return Command(
101
+ return ArgparseCommand(
129
102
  (name if name is not None else fn.__name__).replace('_', '-'),
130
103
  fn,
131
104
  args,
@@ -140,7 +113,7 @@ def command(
140
113
  ##
141
114
 
142
115
 
143
- def get_arg_ann_kwargs(ann: ta.Any) -> ta.Mapping[str, ta.Any]:
116
+ def _get_argparse_arg_ann_kwargs(ann: ta.Any) -> ta.Mapping[str, ta.Any]:
144
117
  if ann is str:
145
118
  return {}
146
119
  elif ann is int:
@@ -153,48 +126,51 @@ def get_arg_ann_kwargs(ann: ta.Any) -> ta.Mapping[str, ta.Any]:
153
126
  raise TypeError(ann)
154
127
 
155
128
 
156
- class _AnnotationBox:
157
-
129
+ class _ArgparseCliAnnotationBox:
158
130
  def __init__(self, annotations: ta.Mapping[str, ta.Any]) -> None:
159
131
  super().__init__()
160
132
  self.__annotations__ = annotations # type: ignore
161
133
 
162
134
 
163
- class _CliMeta(type):
135
+ class ArgparseCli:
136
+ def __init__(self, argv: ta.Optional[ta.Sequence[str]] = None) -> None:
137
+ super().__init__()
138
+
139
+ self._argv = argv if argv is not None else sys.argv[1:]
164
140
 
165
- def __new__(mcls, name: str, bases: ta.Sequence[type], namespace: ta.Mapping[str, ta.Any]) -> type:
166
- if not bases:
167
- return super().__new__(mcls, name, tuple(bases), dict(namespace))
141
+ self._args, self._unknown_args = self.get_parser().parse_known_args(self._argv)
168
142
 
169
- bases = list(bases)
170
- namespace = dict(namespace)
143
+ def __init_subclass__(cls, **kwargs: ta.Any) -> None:
144
+ super().__init_subclass__(**kwargs)
145
+
146
+ ns = cls.__dict__
171
147
 
172
148
  objs = {}
173
- mro = c3.merge([list(b.__mro__) for b in bases])
174
- for bns in [bcls.__dict__ for bcls in reversed(mro)] + [namespace]:
149
+ mro = cls.__mro__[::-1]
150
+ for bns in [bcls.__dict__ for bcls in reversed(mro)] + [ns]:
175
151
  bseen = set() # type: ignore
176
152
  for k, v in bns.items():
177
- if isinstance(v, (Command, Arg)):
178
- check.not_in(v, bseen)
153
+ if isinstance(v, (ArgparseCommand, ArgparseArg)):
154
+ check_not_in(v, bseen)
179
155
  bseen.add(v)
180
156
  objs[k] = v
181
157
  elif k in objs:
182
158
  del [k]
183
159
 
184
- anns = ta.get_type_hints(_AnnotationBox({
160
+ anns = ta.get_type_hints(_ArgparseCliAnnotationBox({
185
161
  **{k: v for bcls in reversed(mro) for k, v in getattr(bcls, '__annotations__', {}).items()},
186
- **namespace.get('__annotations__', {}),
187
- }), globalns=namespace.get('__globals__', {}))
162
+ **ns.get('__annotations__', {}),
163
+ }), globalns=ns.get('__globals__', {}))
188
164
 
189
- if 'parser' in namespace:
190
- parser = check.isinstance(namespace.pop('parser'), ArgumentParser)
165
+ if '_parser' in ns:
166
+ parser = check_isinstance(ns['_parser'], argparse.ArgumentParser)
191
167
  else:
192
- parser = ArgumentParser()
193
- namespace['_parser'] = parser
168
+ parser = argparse.ArgumentParser()
169
+ setattr(cls, '_parser', parser)
194
170
 
195
171
  subparsers = parser.add_subparsers()
196
172
  for att, obj in objs.items():
197
- if isinstance(obj, Command):
173
+ if isinstance(obj, ArgparseCommand):
198
174
  if obj.parent is not None:
199
175
  raise NotImplementedError
200
176
  for cn in [obj.name, *(obj.aliases or [])]:
@@ -203,7 +179,7 @@ class _CliMeta(type):
203
179
  if (
204
180
  len(arg.args) == 1 and
205
181
  isinstance(arg.args[0], str) and
206
- not (n := check.isinstance(arg.args[0], str)).startswith('-') and
182
+ not (n := check_isinstance(arg.args[0], str)).startswith('-') and
207
183
  'metavar' not in arg.kwargs
208
184
  ):
209
185
  cparser.add_argument(
@@ -215,9 +191,9 @@ class _CliMeta(type):
215
191
  cparser.add_argument(*arg.args, **arg.kwargs)
216
192
  cparser.set_defaults(_cmd=obj)
217
193
 
218
- elif isinstance(obj, Arg):
194
+ elif isinstance(obj, ArgparseArg):
219
195
  if att in anns:
220
- akwargs = get_arg_ann_kwargs(anns[att])
196
+ akwargs = _get_argparse_arg_ann_kwargs(anns[att])
221
197
  obj.kwargs = {**akwargs, **obj.kwargs}
222
198
  if not obj.dest:
223
199
  if 'dest' in obj.kwargs:
@@ -229,22 +205,10 @@ class _CliMeta(type):
229
205
  else:
230
206
  raise TypeError(obj)
231
207
 
232
- return super().__new__(mcls, name, tuple(bases), namespace)
233
-
234
-
235
- class Cli(metaclass=_CliMeta):
236
-
237
- def __init__(self, argv: ta.Sequence[str] | None = None) -> None:
238
- super().__init__()
239
-
240
- self._argv = argv if argv is not None else sys.argv[1:]
241
-
242
- self._args, self._unknown_args = self.get_parser().parse_known_args(self._argv)
243
-
244
- _parser: ta.ClassVar[ArgumentParser]
208
+ _parser: ta.ClassVar[argparse.ArgumentParser]
245
209
 
246
210
  @classmethod
247
- def get_parser(cls) -> ArgumentParser:
211
+ def get_parser(cls) -> argparse.ArgumentParser:
248
212
  return cls._parser
249
213
 
250
214
  @property
@@ -252,17 +216,17 @@ class Cli(metaclass=_CliMeta):
252
216
  return self._argv
253
217
 
254
218
  @property
255
- def args(self) -> Namespace:
219
+ def args(self) -> argparse.Namespace:
256
220
  return self._args
257
221
 
258
222
  @property
259
223
  def unknown_args(self) -> ta.Sequence[str]:
260
224
  return self._unknown_args
261
225
 
262
- def _run_cmd(self, cmd: Command) -> int | None:
226
+ def _run_cmd(self, cmd: ArgparseCommand) -> ta.Optional[int]:
263
227
  return cmd.__get__(self, type(self))()
264
228
 
265
- def __call__(self) -> int | None:
229
+ def __call__(self) -> ta.Optional[int]:
266
230
  cmd = getattr(self.args, '_cmd', None)
267
231
 
268
232
  if self._unknown_args and not (cmd is not None and cmd.accepts_unknown):
@@ -270,7 +234,7 @@ class Cli(metaclass=_CliMeta):
270
234
  if (parser := self.get_parser()).exit_on_error: # type: ignore
271
235
  parser.error(msg)
272
236
  else:
273
- raise ArgumentError(None, msg)
237
+ raise argparse.ArgumentError(None, msg)
274
238
 
275
239
  if cmd is None:
276
240
  self.get_parser().print_help()
omlish/check.py CHANGED
@@ -1,6 +1,8 @@
1
1
  """
2
2
  TODO:
3
3
  - def maybe(v: lang.Maybe[T])
4
+ - patch / override lite.check ?
5
+ - checker interface?
4
6
  """
5
7
  import collections
6
8
  import threading
omlish/io/__init__.py CHANGED
@@ -1,3 +0,0 @@
1
- from ..lite.io import ( # noqa
2
- DelimitingBuffer,
3
- )
@@ -1,11 +1,12 @@
1
1
  # ruff: noqa: UP007
2
+ # @omlish-lite
2
3
  import io
3
4
  import typing as ta
4
5
 
5
- from .check import check_isinstance
6
- from .check import check_non_empty
7
- from .check import check_not_none
8
- from .strings import attr_repr
6
+ from ..lite.check import check_isinstance
7
+ from ..lite.check import check_not_empty
8
+ from ..lite.check import check_not_none
9
+ from ..lite.strings import attr_repr
9
10
 
10
11
 
11
12
  class DelimitingBuffer:
@@ -192,7 +193,7 @@ class IncrementalWriteBuffer:
192
193
  ) -> None:
193
194
  super().__init__()
194
195
 
195
- check_non_empty(data)
196
+ check_not_empty(data)
196
197
  self._len = len(data)
197
198
  self._write_size = write_size
198
199
 
@@ -207,11 +208,11 @@ class IncrementalWriteBuffer:
207
208
  return self._len - self._pos
208
209
 
209
210
  def write(self, fn: ta.Callable[[bytes], int]) -> int:
210
- lst = check_non_empty(self._lst)
211
+ lst = check_not_empty(self._lst)
211
212
 
212
213
  t = 0
213
214
  for i, d in enumerate(lst): # noqa
214
- n = fn(check_non_empty(d))
215
+ n = fn(check_not_empty(d))
215
216
  if not n:
216
217
  break
217
218
  t += n
File without changes
@@ -2,15 +2,15 @@
2
2
  import socket
3
3
  import typing as ta
4
4
 
5
- from ..check import check_isinstance
6
- from ..check import check_none
7
- from ..check import check_not_none
8
- from ..check import check_state
9
- from ..http.coroserver import CoroHttpServer
10
- from ..http.handlers import HttpHandler
11
- from ..io import IncrementalWriteBuffer
12
- from ..io import ReadableListBuffer
13
- from ..socket import SocketAddress
5
+ from ...lite.check import check_isinstance
6
+ from ...lite.check import check_none
7
+ from ...lite.check import check_not_none
8
+ from ...lite.check import check_state
9
+ from ...lite.http.coroserver import CoroHttpServer
10
+ from ...lite.http.handlers import HttpHandler
11
+ from ...lite.socket import SocketAddress
12
+ from ..buffers import IncrementalWriteBuffer
13
+ from ..buffers import ReadableListBuffer
14
14
  from .handlers import SocketFdioHandler
15
15
 
16
16
 
@@ -3,8 +3,8 @@ import abc
3
3
  import socket
4
4
  import typing as ta
5
5
 
6
- from ..check import check_not_none
7
- from ..socket import SocketAddress
6
+ from ...lite.check import check_not_none
7
+ from ...lite.socket import SocketAddress
8
8
 
9
9
 
10
10
  class FdioHandler(abc.ABC):
omlish/lite/check.py CHANGED
@@ -41,6 +41,11 @@ def check_non_empty_str(v: ta.Optional[str]) -> str:
41
41
  return v
42
42
 
43
43
 
44
+ def check_arg(v: bool, msg: str = 'Illegal argument') -> None:
45
+ if not v:
46
+ raise ValueError(msg)
47
+
48
+
44
49
  def check_state(v: bool, msg: str = 'Illegal state') -> None:
45
50
  if not v:
46
51
  raise ValueError(msg)
@@ -93,7 +98,7 @@ def check_empty(v: SizedT) -> SizedT:
93
98
  return v
94
99
 
95
100
 
96
- def check_non_empty(v: SizedT) -> SizedT:
101
+ def check_not_empty(v: SizedT) -> SizedT:
97
102
  if not len(v):
98
103
  raise ValueError(v)
99
104
  return v
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev148
3
+ Version: 0.0.0.dev149
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,10 +1,9 @@
1
1
  omlish/.manifests.json,sha256=RX24SRc6DCEg77PUVnaXOKCWa5TF_c9RQJdGIf7gl9c,1135
2
- omlish/__about__.py,sha256=SGKzVFr0tcTK7dCoK2Y4-o8CVkBHmsj2aDPhw4bLYqc,3409
2
+ omlish/__about__.py,sha256=l0_vBxdzereK5v8M0TtiX5ahNihp0_HGdpH8Oq5x5Ag,3409
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
- omlish/argparse.py,sha256=cqKGAqcxuxv_s62z0gq29L9KAvg_3-_rFvXKjVpRJjo,8126
5
4
  omlish/c3.py,sha256=ubu7lHwss5V4UznbejAI0qXhXahrU01MysuHOZI9C4U,8116
6
5
  omlish/cached.py,sha256=UI-XTFBwA6YXWJJJeBn-WkwBkfzDjLBBaZf4nIJA9y0,510
7
- omlish/check.py,sha256=CBOCfl6ANZ7CKke2bGfQfUew9m22_ke0GvfEDO4Sjug,10595
6
+ omlish/check.py,sha256=KWS5IRrBCjzfK_nTRQeF0sRlbo46G-6w4dvkeJDUw8I,10651
8
7
  omlish/datetimes.py,sha256=HajeM1kBvwlTa-uR1TTZHmZ3zTPnnUr1uGGQhiO1XQ0,2152
9
8
  omlish/defs.py,sha256=9uUjJuVIbCBL3g14fyzAp-9gH935MFofvlfOGwcBIaM,4913
10
9
  omlish/dynamic.py,sha256=35C_cCX_Vq2HrHzGk5T-zbrMvmUdiIiwDzDNixczoDo,6541
@@ -75,6 +74,9 @@ omlish/antlr/_runtime/tree/__init__.py,sha256=Jn5lqTVbeUQXD5a4IxDHKibOatAQWVTlaQ
75
74
  omlish/antlr/_runtime/xpath/XPath.py,sha256=CbS0Fpnd2aRt_nQUBJlTpoHpxCyT9qbVW8ldj1aQJKY,9643
76
75
  omlish/antlr/_runtime/xpath/XPathLexer.py,sha256=xFtdr4ZXMZxb2dnB_ggWyhvlQiC7RXQlDS5ePhTyOGg,3505
77
76
  omlish/antlr/_runtime/xpath/__init__.py,sha256=lMd_BbXYdlDhZQN_q0TKN978XW5G0pq618F0NaLkpFE,71
77
+ omlish/argparse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
+ omlish/argparse/all.py,sha256=EfUSf27vFWqa4Q93AycU5YRsrHt-Nx3pU3uNVapb-EE,1054
79
+ omlish/argparse/cli.py,sha256=SULYDE7BDGcU_dfKLguIcBQ0k_ttsyCjPjeqdHBN3Qc,7607
78
80
  omlish/asyncs/__init__.py,sha256=uUz9ziKh4_QrgmdhKFMgq6j7mFbiZd3LiogguDCQsGI,587
79
81
  omlish/asyncs/anyio.py,sha256=gfpx-D8QGmUfhnQxHEaHXcAP8zSMQjcGw4COFTGNnHI,8021
80
82
  omlish/asyncs/asyncio.py,sha256=JfM59QgB3asgEbrps0zoVbNjWD4kL2XdsEkRMEIoFos,971
@@ -256,8 +258,9 @@ omlish/inject/impl/privates.py,sha256=alpCYyk5VJ9lJknbRH2nLVNFYVvFhkj-VC1Vco3zCF
256
258
  omlish/inject/impl/providers.py,sha256=QnwhsujJFIHC0JTgd2Wlo1kP53i3CWTrj1nKU2DNxwg,2375
257
259
  omlish/inject/impl/proxy.py,sha256=1ko0VaKqzu9UG8bIldp9xtUrAVUOFTKWKTjOCqIGr4s,1636
258
260
  omlish/inject/impl/scopes.py,sha256=hKnzNieB-fJSFEXDP_QG1mCfIKoVFIfFlf9LiIt5tk4,5920
259
- omlish/io/__init__.py,sha256=aaIEsXTSfytW-oEkUWczdUJ_ifFY7ihIpyidIbfjkwY,56
261
+ omlish/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
260
262
  omlish/io/abc.py,sha256=Cxs8KB1B_69rxpUYxI-MTsilAmNooJJn3w07DKqYKkE,1255
263
+ omlish/io/buffers.py,sha256=JoifktnJxnNfL8WdhqbcDwEzBcOm-3jJbFk6CooE6aQ,5378
261
264
  omlish/io/pyio.py,sha256=q4RBFVpBE5PYjnGPGT-_4pcZb7dFJmLJ4LtI8OoDRQY,95433
262
265
  omlish/io/trampoline.py,sha256=oUKTQg1F5xQS1431Kt7MbK-NZpX509ubcXU-s86xJr8,7171
263
266
  omlish/io/compress/__init__.py,sha256=qV-aDfPWykTMYcoQmE8THZ4KFDRzqwN3QPPNEJVarXY,86
@@ -272,6 +275,12 @@ omlish/io/compress/lzma.py,sha256=8qxi7TniLN00LyJIJLyp6W7UUU50JBaPxxoXYg2j2XQ,22
272
275
  omlish/io/compress/snappy.py,sha256=kCPgZ7PTBAxAnmYzpQCq4HKUIJ4APeAEXsU3Vg2CaDU,411
273
276
  omlish/io/compress/zlib.py,sha256=MtnVGfzDlRU1LPl2J8Sa3wwgqnTVBx2uclZygWpH9xI,2115
274
277
  omlish/io/compress/zstd.py,sha256=LrYWVHzk-TqWJA_Bnci2i8QOtrqnFFpppLQhLqanDWM,668
278
+ omlish/io/fdio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
279
+ omlish/io/fdio/corohttp.py,sha256=fJKNpED19W_goXdZ6CN_supOyeaMQNgps-E0TQxxjlo,4132
280
+ omlish/io/fdio/handlers.py,sha256=ZtJ6MOVVRjLuKim9sfGMJsVCRvOTMvFYNPfzp1Cyn7M,1353
281
+ omlish/io/fdio/kqueue.py,sha256=YgGBQibkAUYODYDiGl7Enjtx1oQsJXuDsBLBXgqlLQw,3832
282
+ omlish/io/fdio/manager.py,sha256=q4wWf7nKrNtjx6yPEvrVnFt4UtK_BTvVlquEGw7poEo,1250
283
+ omlish/io/fdio/pollers.py,sha256=yNadAt3W5wd90PFmd3vD77bq5QwoVb2A6SM2JjZpKRs,5507
275
284
  omlish/io/generators/__init__.py,sha256=40DTZUqyss40dlgm68yKAtiAlqeIlYylTi8zaFrUW40,1135
276
285
  omlish/io/generators/consts.py,sha256=4r6IMLBMic6MJHVn9UiORIkkPAuxsqtzFT3KV0fatC0,33
277
286
  omlish/io/generators/direct.py,sha256=A9VJB1rNKU3l-NatpYIwyCLI3R_ybGglmdx6sAtoTo4,324
@@ -312,12 +321,11 @@ omlish/lifecycles/states.py,sha256=zqMOU2ZU-MDNnWuwauM3_anIAiXM8LoBDElDEraptFg,1
312
321
  omlish/lifecycles/transitions.py,sha256=qQtFby-h4VzbvgaUqT2NnbNumlcOx9FVVADP9t83xj4,1939
313
322
  omlish/lite/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
314
323
  omlish/lite/cached.py,sha256=hBW77-F7ZLtFqbLwVrlqaJ4-iFHMQleMWZXaZN1IubA,1308
315
- omlish/lite/check.py,sha256=pQC412ffe_Zh7eHa4C1UYn6fA71Ls1vpVM0ZIOroPAY,1765
324
+ omlish/lite/check.py,sha256=VOf_skD5hRzny_aqxykihQRs0PYd3SwkuihXJ2Bfaps,1874
316
325
  omlish/lite/contextmanagers.py,sha256=DRarS2gx15tbse1YzyI8ZLdBmWYjFgmKPe-i4CSNDYg,1458
317
326
  omlish/lite/deathsig.py,sha256=Etz04WX6R2PXQ-BgqJyVJ0C5Pqym6Ds6PAG7p1cqr5o,626
318
327
  omlish/lite/docker.py,sha256=Dj_7lQjs2sFPc_SmUn5CpJF3LnQQnckEBYGBKz8u5tE,392
319
328
  omlish/lite/inject.py,sha256=aRRmFb6azTKF208ogYwVCEopNZx7496Ta1GZmL_IKBA,23716
320
- omlish/lite/io.py,sha256=3ECgUXdRnXyS6pGTSoVr6oB4moI38EpWxTq08zaTM-U,5339
321
329
  omlish/lite/journald.py,sha256=f5Y2Q6-6O3iK_7MoGiwZwoQEOcP7LfkxxQNUR9tMjJM,3882
322
330
  omlish/lite/json.py,sha256=7-02Ny4fq-6YAu5ynvqoijhuYXWpLmfCI19GUeZnb1c,740
323
331
  omlish/lite/logs.py,sha256=1pcGu0ekhVCcLUckLSP16VccnAoprjtl5Vkdfm7y1Wg,6184
@@ -337,12 +345,6 @@ omlish/lite/typing.py,sha256=U3-JaEnkDSYxK4tsu_MzUn3RP6qALBe5FXQXpD-licE,1090
337
345
  omlish/lite/asyncio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
338
346
  omlish/lite/asyncio/asyncio.py,sha256=tsqQSLl5rG4GZHPYOBqI7V2yuw45ZVuGZEHe-J4QEhE,1320
339
347
  omlish/lite/asyncio/subprocesses.py,sha256=crG4FlkVIA19sO2QtIagOCtXk8ak9rLaHgbTjGDy3mk,8274
340
- omlish/lite/fdio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
341
- omlish/lite/fdio/corohttp.py,sha256=FHdakDTGI2UYbCihahuwleyailclxQMUGhpkz3suww4,4080
342
- omlish/lite/fdio/handlers.py,sha256=Wr0O2cvIC8NuLs3yoDHj9ZG4n1g_oVEeT87B0WDsg0Y,1341
343
- omlish/lite/fdio/kqueue.py,sha256=YgGBQibkAUYODYDiGl7Enjtx1oQsJXuDsBLBXgqlLQw,3832
344
- omlish/lite/fdio/manager.py,sha256=q4wWf7nKrNtjx6yPEvrVnFt4UtK_BTvVlquEGw7poEo,1250
345
- omlish/lite/fdio/pollers.py,sha256=yNadAt3W5wd90PFmd3vD77bq5QwoVb2A6SM2JjZpKRs,5507
346
348
  omlish/lite/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
347
349
  omlish/lite/http/coroserver.py,sha256=aBaYjP80yQHQxPxwi7PTYHub-fdRDKsMnB-tM8lBc2o,18095
348
350
  omlish/lite/http/handlers.py,sha256=Yu0P3nqz-frklwCM2PbiWvoJNE-NqeTFLBvpNpqcdtA,753
@@ -508,9 +510,9 @@ omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,329
508
510
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
509
511
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
510
512
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
511
- omlish-0.0.0.dev148.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
512
- omlish-0.0.0.dev148.dist-info/METADATA,sha256=78h6hQTFkljP4Axca6bTAYdlPCtJVukJDCFxbRrx__4,4264
513
- omlish-0.0.0.dev148.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
514
- omlish-0.0.0.dev148.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
515
- omlish-0.0.0.dev148.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
516
- omlish-0.0.0.dev148.dist-info/RECORD,,
513
+ omlish-0.0.0.dev149.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
514
+ omlish-0.0.0.dev149.dist-info/METADATA,sha256=z0AUwvKglpElbQTqOlIdPh5J21U5sNjvUuYimEhJncE,4264
515
+ omlish-0.0.0.dev149.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
516
+ omlish-0.0.0.dev149.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
517
+ omlish-0.0.0.dev149.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
518
+ omlish-0.0.0.dev149.dist-info/RECORD,,
File without changes
File without changes
File without changes
File without changes