omlish 0.0.0.dev148__py3-none-any.whl → 0.0.0.dev149__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.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