omlish 0.0.0.dev468__py3-none-any.whl → 0.0.0.dev470__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.
@@ -0,0 +1,43 @@
1
+ # ruff: noqa: UP043 UP045
2
+ # @omlish-lite
3
+ import dataclasses as dc
4
+
5
+ from .asyncs import AsyncHttpClient
6
+ from .asyncs import AsyncStreamHttpResponse
7
+ from .base import HttpClientContext
8
+ from .base import HttpRequest
9
+ from .sync import HttpClient
10
+ from .sync import StreamHttpResponse
11
+
12
+
13
+ ##
14
+
15
+
16
+ class SyncAsyncHttpClient(AsyncHttpClient):
17
+ def __init__(self, client: HttpClient) -> None:
18
+ super().__init__()
19
+
20
+ self._client = client
21
+
22
+ @dc.dataclass(frozen=True)
23
+ class _StreamAdapter:
24
+ ul: StreamHttpResponse
25
+
26
+ async def read1(self, /, n: int = -1) -> bytes:
27
+ return self.ul.stream.read1(n)
28
+
29
+ async def close(self) -> None:
30
+ self.ul.close()
31
+
32
+ async def _stream_request(self, ctx: HttpClientContext, req: HttpRequest) -> AsyncStreamHttpResponse:
33
+ resp = self._client.stream_request(req, context=ctx)
34
+ return AsyncStreamHttpResponse(
35
+ status=resp.status,
36
+ headers=resp.headers,
37
+ request=req,
38
+ underlying=resp,
39
+ **(dict( # type: ignore
40
+ stream=(adapter := self._StreamAdapter(resp)),
41
+ _closer=adapter.close,
42
+ ) if resp.has_data else {}),
43
+ )
@@ -1,3 +1,5 @@
1
+ # ruff: noqa: UP043 UP045
2
+ # @omlish-lite
1
3
  import http.client
2
4
  import typing as ta
3
5
  import urllib.error
@@ -5,6 +7,7 @@ import urllib.request
5
7
 
6
8
  from ..headers import HttpHeaders
7
9
  from .base import DEFAULT_ENCODING
10
+ from .base import HttpClientContext
8
11
  from .base import HttpClientError
9
12
  from .base import HttpRequest
10
13
  from .sync import HttpClient
@@ -39,7 +42,7 @@ class UrllibHttpClient(HttpClient):
39
42
  data=d,
40
43
  )
41
44
 
42
- def _stream_request(self, req: HttpRequest) -> StreamHttpResponse:
45
+ def _stream_request(self, ctx: HttpClientContext, req: HttpRequest) -> StreamHttpResponse:
43
46
  try:
44
47
  resp = urllib.request.urlopen( # noqa
45
48
  self._build_request(req),
@@ -53,7 +56,6 @@ class UrllibHttpClient(HttpClient):
53
56
  headers=HttpHeaders(e.headers.items()),
54
57
  request=req,
55
58
  underlying=e,
56
- stream=e, # noqa
57
59
  _closer=e.close,
58
60
  )
59
61
 
@@ -116,10 +116,10 @@ class CoroHttpClientConnection:
116
116
  _http_version = 11
117
117
  _http_version_str = 'HTTP/1.1'
118
118
 
119
- http_port: ta.ClassVar[int] = 80
120
- https_port: ta.ClassVar[int] = 443
119
+ HTTP_PORT: ta.ClassVar[int] = 80
120
+ HTTPS_PORT: ta.ClassVar[int] = 443
121
121
 
122
- default_port = http_port
122
+ DEFAULT_PORT: ta.ClassVar[int] = HTTP_PORT
123
123
 
124
124
  class _NOT_SET: # noqa
125
125
  def __new__(cls, *args, **kwargs): # noqa
@@ -139,6 +139,7 @@ class CoroHttpClientConnection:
139
139
  source_address: ta.Optional[str] = None,
140
140
  block_size: int = 8192,
141
141
  auto_open: bool = True,
142
+ default_port: ta.Optional[int] = None,
142
143
  ) -> None:
143
144
  super().__init__()
144
145
 
@@ -146,6 +147,9 @@ class CoroHttpClientConnection:
146
147
  self._source_address = source_address
147
148
  self._block_size = block_size
148
149
  self._auto_open = auto_open
150
+ if default_port is None:
151
+ default_port = self.DEFAULT_PORT
152
+ self._default_port = default_port
149
153
 
150
154
  self._connected = False
151
155
  self._buffer: ta.List[bytes] = []
@@ -162,6 +166,10 @@ class CoroHttpClientConnection:
162
166
 
163
167
  CoroHttpClientValidation.validate_host(self._host)
164
168
 
169
+ @property
170
+ def http_version(self) -> int:
171
+ return self._http_version
172
+
165
173
  #
166
174
 
167
175
  def _get_hostport(self, host: str, port: ta.Optional[int]) -> ta.Tuple[str, int]:
@@ -173,12 +181,12 @@ class CoroHttpClientConnection:
173
181
  port = int(host[i + 1:])
174
182
  except ValueError:
175
183
  if host[i + 1:] == '': # http://foo.com:/ == http://foo.com/
176
- port = self.default_port
184
+ port = self._default_port
177
185
  else:
178
186
  raise CoroHttpClientErrors.InvalidUrlError(f"non-numeric port: '{host[i + 1:]}'") from None
179
187
  host = host[:i]
180
188
  else:
181
- port = self.default_port
189
+ port = self._default_port
182
190
 
183
191
  if host and host[0] == '[' and host[-1] == ']':
184
192
  host = host[1:-1]
@@ -286,6 +294,7 @@ class CoroHttpClientConnection:
286
294
  source_address=self._source_address,
287
295
  **(dict(timeout=self._timeout) if self._timeout is not self._NOT_SET else {}),
288
296
  ),
297
+ server_hostname=self._tunnel_host if self._tunnel_host else self._host,
289
298
  )))
290
299
 
291
300
  self._connected = True
@@ -526,7 +535,7 @@ class CoroHttpClientConnection:
526
535
  if ':' in host:
527
536
  host_enc = self._strip_ipv6_iface(host_enc)
528
537
 
529
- if port == self.default_port:
538
+ if port == self._default_port:
530
539
  self.put_header('Host', host_enc)
531
540
  else:
532
541
  self.put_header('Host', f"{host_enc.decode('ascii')}:{port}")
omlish/http/coro/io.py CHANGED
@@ -37,6 +37,8 @@ class CoroHttpIo:
37
37
  args: ta.Tuple[ta.Any, ...]
38
38
  kwargs: ta.Optional[ta.Dict[str, ta.Any]] = None
39
39
 
40
+ server_hostname: ta.Optional[str] = None
41
+
40
42
  #
41
43
 
42
44
  class CloseIo(Io):
omlish/http/urls.py ADDED
@@ -0,0 +1,67 @@
1
+ # ruff: noqa: UP006 UP007 UP045
2
+ # @omlish-lite
3
+ import re
4
+ import typing as ta
5
+ import urllib.parse
6
+
7
+ from ..lite.cached import cached_nullary
8
+
9
+
10
+ ##
11
+
12
+
13
+ @cached_nullary
14
+ def _url_split_host_pat() -> re.Pattern:
15
+ return re.compile('//([^/#?]*)(.*)', re.DOTALL)
16
+
17
+
18
+ def url_split_host(url: str) -> ta.Tuple[ta.Optional[str], str]:
19
+ """splithost('//host[:port]/path') --> 'host[:port]', '/path'."""
20
+
21
+ # https://github.com/python/cpython/blob/364ae607d8035db8ba92486ebebd8225446c1a90/Lib/urllib/parse.py#L1143
22
+ if not (m := _url_split_host_pat().match(url)):
23
+ return None, url
24
+
25
+ host_port, path = m.groups()
26
+ if path and path[0] != '/':
27
+ path = '/' + path
28
+ return host_port, path
29
+
30
+
31
+ ##
32
+
33
+
34
+ def unparse_url_request_path(url: ta.Union[str, urllib.parse.ParseResult]) -> str:
35
+ if isinstance(url, urllib.parse.ParseResult):
36
+ ups = url
37
+ else:
38
+ ups = urllib.parse.urlparse(url)
39
+
40
+ return urllib.parse.urlunparse((
41
+ '',
42
+ '',
43
+ ups.path,
44
+ ups.params,
45
+ ups.query,
46
+ ups.fragment,
47
+ ))
48
+
49
+
50
+ def parsed_url_replace(
51
+ url: urllib.parse.ParseResult,
52
+ *,
53
+ scheme: ta.Optional[str] = None,
54
+ netloc: ta.Optional[str] = None,
55
+ path: ta.Optional[str] = None,
56
+ params: ta.Optional[str] = None,
57
+ query: ta.Optional[str] = None,
58
+ fragment: ta.Optional[str] = None,
59
+ ) -> urllib.parse.ParseResult:
60
+ return urllib.parse.ParseResult(
61
+ scheme if scheme is not None else url.scheme,
62
+ netloc if netloc is not None else url.netloc,
63
+ path if path is not None else url.path,
64
+ params if params is not None else url.params,
65
+ query if query is not None else url.query,
66
+ fragment if fragment is not None else url.fragment,
67
+ )
@@ -75,6 +75,7 @@ def build_kwargs_target(
75
75
  skip_args: int = 0,
76
76
  skip_kwargs: ta.Iterable[str] | None = None,
77
77
  raw_optional: bool = False,
78
+ non_strict: bool = False,
78
79
  ) -> KwargsTarget:
79
80
  if isinstance(obj, KwargsTarget):
80
81
  return obj
@@ -93,11 +94,15 @@ def build_kwargs_target(
93
94
  continue
94
95
 
95
96
  if p.annotation is inspect.Signature.empty:
97
+ if non_strict:
98
+ continue
96
99
  if p.default is not inspect.Parameter.empty:
97
100
  raise KeyError(f'{obj}, {p.name}')
98
101
  continue
99
102
 
100
103
  if p.kind not in (inspect.Parameter.POSITIONAL_OR_KEYWORD, inspect.Parameter.KEYWORD_ONLY):
104
+ if non_strict:
105
+ continue
101
106
  raise TypeError(sig)
102
107
 
103
108
  ann = p.annotation
@@ -122,7 +127,8 @@ def build_kwargs_target(
122
127
  k = dc.replace(k, tag=pt)
123
128
 
124
129
  if k in seen:
125
- raise ConflictingKeyError(k)
130
+ if not non_strict:
131
+ raise ConflictingKeyError(k)
126
132
  seen.add(k)
127
133
 
128
134
  kws.append(Kwarg(
omlish/io/buffers.py CHANGED
@@ -208,6 +208,9 @@ class ReadableListBuffer:
208
208
 
209
209
  def read(self, n: ta.Optional[int] = None) -> ta.Optional[bytes]:
210
210
  if n is None:
211
+ if not self._lst:
212
+ return b''
213
+
211
214
  o = b''.join(self._lst)
212
215
  self._lst = []
213
216
  return o
omlish/lang/__init__.py CHANGED
@@ -283,6 +283,7 @@ with _auto_proxy_init(globals(), update_exports=True):
283
283
 
284
284
  new_function,
285
285
  new_function_kwargs,
286
+ copy_function,
286
287
  )
287
288
 
288
289
  from .generators import ( # noqa
@@ -420,6 +421,8 @@ with _auto_proxy_init(globals(), update_exports=True):
420
421
  )
421
422
 
422
423
  from .params import ( # noqa
424
+ CanParamSpec,
425
+
423
426
  Param,
424
427
 
425
428
  VarParam,
omlish/lang/functions.py CHANGED
@@ -250,16 +250,17 @@ def new_function(
250
250
  # a tuple that supplies the bindings for free variables
251
251
  closure: tuple | None = None,
252
252
 
253
- # # a dictionary that specifies the default keyword argument values
254
- # kwdefaults: dict | None = None,
253
+ # a dictionary that specifies the default keyword argument values
254
+ kwdefaults: dict | None = None,
255
255
  ) -> types.FunctionType:
256
+ # https://github.com/python/cpython/blob/9c8eade20c6c6cc6f31dffb5e42472391d63bbf4/Objects/funcobject.c#L909
256
257
  return types.FunctionType(
257
258
  code=code,
258
259
  globals=globals,
259
260
  name=name,
260
261
  argdefs=argdefs,
261
262
  closure=closure,
262
- # kwdefaults=kwdefaults,
263
+ kwdefaults=kwdefaults,
263
264
  )
264
265
 
265
266
 
@@ -270,5 +271,9 @@ def new_function_kwargs(f: types.FunctionType) -> dict[str, ta.Any]:
270
271
  name=f.__name__,
271
272
  argdefs=f.__defaults__,
272
273
  closure=f.__closure__,
273
- # kwdefaults=f.__kwdefaults__,
274
+ kwdefaults=f.__kwdefaults__,
274
275
  )
276
+
277
+
278
+ def copy_function(f: types.FunctionType) -> types.FunctionType:
279
+ return new_function(**new_function_kwargs(f))
omlish/lang/params.py CHANGED
@@ -1,6 +1,7 @@
1
1
  """
2
2
  TODO:
3
3
  - check validity
4
+ - signature vs getfullargspec - diff unwrapping + 'self' handling
4
5
  """
5
6
  import dataclasses as dc
6
7
  import enum
@@ -16,6 +17,13 @@ from .classes.restrict import Sealed
16
17
  T = ta.TypeVar('T')
17
18
 
18
19
 
20
+ CanParamSpec: ta.TypeAlias = ta.Union[
21
+ 'ParamSpec',
22
+ inspect.Signature,
23
+ ta.Callable,
24
+ ]
25
+
26
+
19
27
  ##
20
28
 
21
29
 
@@ -101,6 +109,15 @@ class ParamSpec(ta.Sequence[Param], Final):
101
109
 
102
110
  #
103
111
 
112
+ @classmethod
113
+ def of(cls, obj: CanParamSpec) -> 'ParamSpec':
114
+ if isinstance(obj, ParamSpec):
115
+ return obj
116
+ elif isinstance(obj, inspect.Signature):
117
+ return cls.of_signature(obj)
118
+ else:
119
+ return cls.inspect(obj)
120
+
104
121
  @classmethod
105
122
  def of_signature(
106
123
  cls,
omlish/sync.py CHANGED
@@ -1,3 +1,5 @@
1
+ # ruff: noqa: UP006 UP043 UP045
2
+ # @omlish-lite
1
3
  """
2
4
  TODO:
3
5
  - sync (lol) w/ asyncs.anyio
@@ -8,7 +10,7 @@ import collections
8
10
  import threading
9
11
  import typing as ta
10
12
 
11
- from . import lang
13
+ from .lite.maybes import Maybe
12
14
 
13
15
 
14
16
  T = ta.TypeVar('T')
@@ -17,7 +19,7 @@ T = ta.TypeVar('T')
17
19
  ##
18
20
 
19
21
 
20
- class Once:
22
+ class SyncOnce:
21
23
  def __init__(self) -> None:
22
24
  super().__init__()
23
25
 
@@ -40,43 +42,43 @@ class Once:
40
42
  ##
41
43
 
42
44
 
43
- class Lazy(ta.Generic[T]):
45
+ class SyncLazy(ta.Generic[T]):
44
46
  def __init__(self) -> None:
45
47
  super().__init__()
46
48
 
47
- self._once = Once()
48
- self._v: lang.Maybe[T] = lang.empty()
49
+ self._once = SyncOnce()
50
+ self._v: Maybe[T] = Maybe.empty()
49
51
 
50
- def peek(self) -> lang.Maybe[T]:
52
+ def peek(self) -> Maybe[T]:
51
53
  return self._v
52
54
 
53
55
  def set(self, v: T) -> None:
54
- self._v = lang.just(v)
56
+ self._v = Maybe.just(v)
55
57
 
56
58
  def get(self, fn: ta.Callable[[], T]) -> T:
57
59
  def do():
58
- self._v = lang.just(fn())
60
+ self._v = Maybe.just(fn())
59
61
  self._once.do(do)
60
62
  return self._v.must()
61
63
 
62
64
 
63
- class LazyFn(ta.Generic[T]):
65
+ class SyncLazyFn(ta.Generic[T]):
64
66
  def __init__(self, fn: ta.Callable[[], T]) -> None:
65
67
  super().__init__()
66
68
 
67
69
  self._fn = fn
68
- self._once = Once()
69
- self._v: lang.Maybe[T] = lang.empty()
70
+ self._once = SyncOnce()
71
+ self._v: Maybe[T] = Maybe.empty()
70
72
 
71
- def peek(self) -> lang.Maybe[T]:
73
+ def peek(self) -> Maybe[T]:
72
74
  return self._v
73
75
 
74
76
  def set(self, v: T) -> None:
75
- self._v = lang.just(v)
77
+ self._v = Maybe.just(v)
76
78
 
77
79
  def get(self) -> T:
78
80
  def do():
79
- self._v = lang.just(self._fn())
81
+ self._v = Maybe.just(self._fn())
80
82
  self._once.do(do)
81
83
  return self._v.must()
82
84
 
@@ -89,11 +91,11 @@ class ConditionDeque(ta.Generic[T]):
89
91
  self,
90
92
  *,
91
93
  cond: ta.Optional['threading.Condition'] = None,
92
- deque: collections.deque[T] | None = None,
94
+ deque: ta.Optional[ta.Deque[T]] = None,
93
95
 
94
96
  lock: ta.Optional['threading.RLock'] = None,
95
- maxlen: int | None = None,
96
- init: ta.Iterable[T] | None = None,
97
+ maxlen: ta.Optional[int] = None,
98
+ init: ta.Optional[ta.Iterable[T]] = None,
97
99
  ) -> None:
98
100
  super().__init__()
99
101
 
@@ -112,7 +114,7 @@ class ConditionDeque(ta.Generic[T]):
112
114
  return self._cond
113
115
 
114
116
  @property
115
- def deque(self) -> collections.deque[T]:
117
+ def deque(self) -> ta.Deque[T]:
116
118
  return self._deque
117
119
 
118
120
  def push(
@@ -126,9 +128,9 @@ class ConditionDeque(ta.Generic[T]):
126
128
 
127
129
  def pop(
128
130
  self,
129
- timeout: float | None = None,
131
+ timeout: ta.Optional[float] = None,
130
132
  *,
131
- if_empty: ta.Callable[[], None] | None = None,
133
+ if_empty: ta.Optional[ta.Callable[[], None]] = None,
132
134
  ) -> T:
133
135
  with self.cond:
134
136
  if not self.deque and if_empty is not None:
@@ -141,7 +143,7 @@ class ConditionDeque(ta.Generic[T]):
141
143
  ##
142
144
 
143
145
 
144
- class BufferRelay(ta.Generic[T]):
146
+ class SyncBufferRelay(ta.Generic[T]):
145
147
  def __init__(
146
148
  self,
147
149
  *,
@@ -152,7 +154,7 @@ class BufferRelay(ta.Generic[T]):
152
154
  self._wake_fn = wake_fn
153
155
 
154
156
  self._lock = threading.Lock()
155
- self._buffer: BufferRelay._Buffer = BufferRelay._Buffer()
157
+ self._buffer: SyncBufferRelay._Buffer = SyncBufferRelay._Buffer()
156
158
 
157
159
  class _Buffer:
158
160
  def __init__(self) -> None:
@@ -173,7 +175,7 @@ class BufferRelay(ta.Generic[T]):
173
175
 
174
176
  def swap(self) -> ta.Sequence[T]:
175
177
  with self._lock:
176
- buf, self._buffer = self._buffer, BufferRelay._Buffer()
178
+ buf, self._buffer = self._buffer, SyncBufferRelay._Buffer()
177
179
  return buf.lst
178
180
 
179
181
 
@@ -195,7 +197,7 @@ class CountDownLatch:
195
197
 
196
198
  def wait(
197
199
  self,
198
- timeout: float | None = None,
200
+ timeout: ta.Optional[float] = None,
199
201
  ) -> bool:
200
202
  with self._cond:
201
203
  return self._cond.wait_for(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev468
3
+ Version: 0.0.0.dev470
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.omlish-manifests.json,sha256=FLw7xkPiSXuImZgqSP8BwrEib2R1doSzUPLUkc-QUIA,8410
2
- omlish/__about__.py,sha256=WE_K_l1J2e6fzoAW-jZ_o6mRow7zeKS-5ul4tkWVAFw,3611
2
+ omlish/__about__.py,sha256=V5Z8mEnP0BsV3oc2j2lgsvc5cs3Qd0cHG_3kv3gAQwI,3611
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=ZNIMl1kwg3qdei4DiUrJPQe5M81S1e76N-GuNSwLBAE,8683
5
5
  omlish/cached.py,sha256=MLap_p0rdGoDIMVhXVHm1tsbcWobJF0OanoodV03Ju8,542
@@ -9,7 +9,7 @@ omlish/libc.py,sha256=mNY2FWZ2BjSucOx5TEW8IP_B5n84tVZWuVPL3Z3sUH8,15644
9
9
  omlish/metadata.py,sha256=lTh3NYVyjHtLTyAGiZxXJMjZrSPQ1E8zXvnJCgKSESA,4179
10
10
  omlish/runmodule.py,sha256=vQ9VZN_c3sQX9rj036dW9lXuMWTjGOfWnwDcWTSWnn0,705
11
11
  omlish/shlex.py,sha256=rlbgHWxjwpkCBRphOPqSIN_KD6qWJMLldNJUILulKT0,253
12
- omlish/sync.py,sha256=mUjvZZUnnaAdTBPGu8QsUYS9f86MYW6TFl_PTN5pxGQ,4492
12
+ omlish/sync.py,sha256=lOOHiz8nNXECAEoq7gmSdOlkKPuXzbAqC25qsMTB3KI,4591
13
13
  omlish/algorithm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  omlish/algorithm/all.py,sha256=FudUHwoaRLNNmqYM3jhP2Yd2BpmYhNBRPaVZzARMoSc,194
15
15
  omlish/algorithm/distribute.py,sha256=juv6JaCynQG6RaxX0fnNNEVJcvZ8hUS2Mv3ND2t9Y3w,1544
@@ -23,6 +23,7 @@ omlish/asyncs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
23
  omlish/asyncs/all.py,sha256=zE9zBNepDSczQ-QhnzwFz59IZIex3HuUqfKIgwbJLgY,329
24
24
  omlish/asyncs/buffers.py,sha256=_Ds4Aa1bUWQwQTGmcYsKLjcJ_d5HgbSkPTFrG9y-eMQ,1424
25
25
  omlish/asyncs/flavors.py,sha256=1mNxGNRVmjUHzA13K5ht8vdJv4CLEmzYTQ6BZXr1520,4866
26
+ omlish/asyncs/sync.py,sha256=8aWOfRXF6URtWRV3ZL5mT4ElSRIEljLNNWUnjjM2Rp4,446
26
27
  omlish/asyncs/trio.py,sha256=fmZ5b_lKdVV8NQ3euCUutWgnkqTFzSnOjvJSA_jvmrE,367
27
28
  omlish/asyncs/trio_asyncio.py,sha256=b6H5H32pB79Uz5xvWEmuhXTJgTAeKFHBHzocv_Rpt5A,1332
28
29
  omlish/asyncs/anyio/__init__.py,sha256=AkwRD3XFWmEzBeHV-eAzwpA4F04bl7xyyapigrxMR8g,1747
@@ -39,6 +40,7 @@ omlish/asyncs/asyncio/channels.py,sha256=oniTpmw_eeKK70APyEZLhRUChwLwebE4N0_uZiw
39
40
  omlish/asyncs/asyncio/sockets.py,sha256=i1a2DZ52IuvRQQQW8FJxEUFboqpKn_K08a_MsMaecqU,1264
40
41
  omlish/asyncs/asyncio/streams.py,sha256=Laa9BNwajZ7Wt_rJoYMbQtfSX4Q4i-dVHhtYSekCHXM,1015
41
42
  omlish/asyncs/asyncio/subprocesses.py,sha256=FlnI23o2Rm-T-gXHWuHCaVeMoLKzgStk3CPO0OPIth4,6307
43
+ omlish/asyncs/asyncio/sync.py,sha256=d-iALb_3IaMxW1KKbcHVX7eDMDruUfrfaH7zkzUsXhM,980
42
44
  omlish/asyncs/asyncio/timeouts.py,sha256=lJ4qmDqyxUeAQCXJGiLL8pxYwoR1F1lntZ18HVf40Wo,452
43
45
  omlish/asyncs/asyncio/utils.py,sha256=dCC4hXqCTKBpU5urAXsKUIIua2M9JXAtumwh7IUEu7E,2443
44
46
  omlish/asyncs/ioproxy/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
@@ -302,7 +304,7 @@ omlish/graphs/dot/make.py,sha256=e-M1IEdh4kHEjJmBxpaEUPxvFLrm5uIXdGxjQZr2HRo,365
302
304
  omlish/graphs/dot/rendering.py,sha256=SGSpwswdFqsjEnznQDyryIsXE8bzPXSUFAJHlB2uT2Y,3655
303
305
  omlish/graphs/dot/utils.py,sha256=8cGKIdcM-w1q4ITUYyC0lnYwLqNWuH2OddmmbLxVgEo,806
304
306
  omlish/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
305
- omlish/http/all.py,sha256=YdSZdd_Sq0CxxqcSBli0xBc75Fx-flA306zkSX_z4AQ,1654
307
+ omlish/http/all.py,sha256=_SyJXPCk3s4FrYZ37pY3f4DI3ULmbwnR6J9hFd7thys,2219
306
308
  omlish/http/asgi.py,sha256=4r2Gw1ojwp2OVpwonof1p4GFRcseIJqPhpkQpLhM9Jw,3243
307
309
  omlish/http/consts.py,sha256=7BJ4D1MdIvqBcepkgCfBFHolgTwbOlqsOEiee_IjxOA,2289
308
310
  omlish/http/cookies.py,sha256=uuOYlHR6e2SC3GM41V0aozK10nef9tYg83Scqpn5-HM,6351
@@ -317,19 +319,25 @@ omlish/http/parsing.py,sha256=9qwTYFmg9b1WESKOK5IzTYZY8RRXQCKtmgNodiAmiSs,14381
317
319
  omlish/http/sessions.py,sha256=TfTJ_j-6c9PelG_RmijEwozfaVm3O7YzgtFvp8VzQqM,4799
318
320
  omlish/http/sse.py,sha256=Z16cSD6L8YIA0JRMS2BYP3oPwUE3L9Vs-tIDuO_Vp98,2320
319
321
  omlish/http/urllib.py,sha256=LwtMXDkjb9tYnOi6iApizHXpCiyjB1r72ePo_Nzv1vQ,466
322
+ omlish/http/urls.py,sha256=dZBeQwf5ogKwsD_uCEei5EG_SbnHk-MzpX2FYLsfTgM,1774
320
323
  omlish/http/versions.py,sha256=Lwk6FztKH7c5zuc7NFWxPVULuLeeQp5-NFJInY6r-Zo,420
321
324
  omlish/http/wsgi.py,sha256=1JpfrY2JrQ0wrEVE0oLdQMWZw8Zcx0b4_9f3VmH4JKA,1070
322
325
  omlish/http/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
323
- omlish/http/clients/asyncs.py,sha256=9AAVQVYuntDZVGZNatiK2SRS2OxHqDHlDgpuu6rkpSQ,3923
324
- omlish/http/clients/base.py,sha256=2yv4zLMBhE0JYSKpUHZ9MUVZZ_if3AyOIFTVcZsepAs,2670
325
- omlish/http/clients/default.py,sha256=y8dmcCmBgqnj_2ogVZ8NYyfq4k6dpI6t293o-12aorY,2937
326
- omlish/http/clients/httpx.py,sha256=zjF0fg_XkurXP5CukYGzRrEaTJNFp4VaDjV5xGxj2Fo,3529
327
- omlish/http/clients/sync.py,sha256=E85phmFqOkdE-LgyXOZGc6u2hA24Vm5-p3UzMpYdgBs,3572
328
- omlish/http/clients/urllib.py,sha256=dQEI_nwTqn92vA2ikrnwDBD88a_DELRG6qBPS1kxGRQ,2701
326
+ omlish/http/clients/asyncs.py,sha256=YJKin04lXSrhn8tgs2gMEo8Fy4jWkPhy6ZaWi1fVnko,4427
327
+ omlish/http/clients/base.py,sha256=bm3Oy2wuunSO3Rd2dxCmhHoZcQ8X9B5pkzaudbjZKvI,2810
328
+ omlish/http/clients/default.py,sha256=fnz-pvPKHc7Kgft4XRwOZ6ZUUtt5D6ljuvOGAA8mgQw,5639
329
+ omlish/http/clients/executor.py,sha256=A9LLTR3O_-_hH6HAB3hvf5uBv9SwLL5YOW3YWVb20Js,1580
330
+ omlish/http/clients/httpx.py,sha256=8CVA9nNVKSkKcEynu34GxcbfVaz3PBA_UBx3-NFKDrw,4448
331
+ omlish/http/clients/middleware.py,sha256=xnXlNN1MU4sUKtkhPzdpRQsRh9wpLf1r7OGKjqGzLWg,5058
332
+ omlish/http/clients/sync.py,sha256=zs6XzFHKwKhKuBwb6hJFaYOcBY-4QVEsa0udFOoU0QM,4058
333
+ omlish/http/clients/syncasync.py,sha256=veVSD-uqOzePAUzhXOoJvMF6fHLOkzXYbviQ9x18l1k,1215
334
+ omlish/http/clients/urllib.py,sha256=BwxlDEiJQZA6sogcqTtuog6WEK2OhVNLR70F50lXA9I,2764
335
+ omlish/http/clients/coro/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
336
+ omlish/http/clients/coro/sync.py,sha256=JCWSCsDP7rFBRQSxzB7WmBBwRdAfLFRGI-F_4f0jiPQ,5673
329
337
  omlish/http/coro/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
330
- omlish/http/coro/io.py,sha256=ty0u1HS5sYOgrUHJGY2YdpTEU38oj2GXqN9zWV_Neoo,1040
338
+ omlish/http/coro/io.py,sha256=d97Oa7KlgMP7BQWdhUbOv3sfA96uWyMtjJF7lJFwZC0,1090
331
339
  omlish/http/coro/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
332
- omlish/http/coro/client/connection.py,sha256=RuyhvjQ8o7cbRSF03joxc2Rh6bABmQVGk1NIq4cbHcU,30922
340
+ omlish/http/coro/client/connection.py,sha256=5QQGZIHDGkmB6_LFDVGMcRTnIvd3I-ap_ImrNXEWRn4,31282
333
341
  omlish/http/coro/client/errors.py,sha256=_jwsO9wfwA22ybvkdKnKS6Kbac_qoGbDmuIJbJdjusc,1254
334
342
  omlish/http/coro/client/headers.py,sha256=txEq2JK7oPPWx76xKQz89ZKolLelLywO7vOg63ehX4c,4631
335
343
  omlish/http/coro/client/response.py,sha256=yvG7K8QTljgal3DuWJOwGmdc4mOWwxSglmEs1EWes18,17928
@@ -370,7 +378,7 @@ omlish/inject/impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
370
378
  omlish/inject/impl/bindings.py,sha256=xSvUcoDz8NH-aNHPwBPEZsFg73K2WcF_A63npVbGt_k,420
371
379
  omlish/inject/impl/elements.py,sha256=qR06KaAjZMaQgdMBE6_tdrT7cWP1Ft0CFq71bnyp224,6265
372
380
  omlish/inject/impl/injector.py,sha256=tcPyq_747L12G3CT_rA9KU4l_gWlesX0uCDv3GJOZGY,8366
373
- omlish/inject/impl/inspect.py,sha256=UcCaQEhQfRINrY9Phz9UYKCuAg7HnZTqBJ2i-6j_O1A,3193
381
+ omlish/inject/impl/inspect.py,sha256=6emiBEyaVmH2m1U5Zv5VX7-f8Gor0VOQSUEqhlcT6VU,3366
374
382
  omlish/inject/impl/maysync.py,sha256=7GWjrvJStOx85BCvk8IJAmmkoGkChFAAi2h7j2pe6Qs,1207
375
383
  omlish/inject/impl/multis.py,sha256=5aKXnmSocwqu7y6WicvYX1-QGTz9iHubxRq9j0enlgk,2174
376
384
  omlish/inject/impl/origins.py,sha256=dgGdkoMN6I4DZrWjlpZYijeFsrF6Up1WPq_QSAgTtuQ,1676
@@ -382,7 +390,7 @@ omlish/inject/impl/scopes.py,sha256=sqtjHe6g0pAEOHqIARXGiIE9mKmGmlqh1FDpskV4TIw,
382
390
  omlish/inject/impl/sync.py,sha256=v0FrcMfEFIT358AmAuERvzJ3o19r6DLZj6_0hjuW5Dk,1090
383
391
  omlish/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
384
392
  omlish/io/abc.py,sha256=M40QB2udYpCEqmlxCcHv6FlJYJY6ymmJQBlaklYv0U8,1256
385
- omlish/io/buffers.py,sha256=WRuojN-EICJ9eIhy6U2Tw2-oTBIwHTBhN86wQiD2s88,7293
393
+ omlish/io/buffers.py,sha256=GuddTeEeaNU4Ep2NWEeS-8ZO05JF8guPCGeTBNQ3mek,7351
386
394
  omlish/io/fileno.py,sha256=_W3qxkIKpnabn1_7kgmKdx0IsPF3R334xWnF_TtkEj4,185
387
395
  omlish/io/pyio.py,sha256=xmHTV-sn7QZThWCVBo6lTM7dhgsQn7m2L0DqRwdF2-8,94509
388
396
  omlish/io/compress/__init__.py,sha256=fJFPT4ONfqxmsA4jR6qbMt2woIyyEgnc_qOWK9o1kII,247
@@ -414,7 +422,7 @@ omlish/iterators/recipes.py,sha256=wOwOZg-zWG9Zc3wcAxJFSe2rtavVBYwZOfG09qYEx_4,4
414
422
  omlish/iterators/tools.py,sha256=M16LXrJhMdsz5ea2qH0vws30ZvhQuQSCVFSLpRf_gTg,2096
415
423
  omlish/iterators/transforms.py,sha256=YHVdD9nBkS1k4kogi4Ba0UOTU_pKkuX9jGw1Tqj3UMw,3598
416
424
  omlish/iterators/unique.py,sha256=BSE-eanva8byFCJi09Nt2zzTsVr8LnTqY1PIInGYRs0,1396
417
- omlish/lang/__init__.py,sha256=UhApcrcf5BXIfgyQwhLGp_PEUlVviJ7mkQrqfl0M5dM,10889
425
+ omlish/lang/__init__.py,sha256=FURfHE3GhTik9XGnfuDePikCeDPndnfDv_5zPm9tKJI,10935
418
426
  omlish/lang/asyncs.py,sha256=iIHJp7nvgJVj7zS0Ji7NsVSzz54vkzrj0Snc83dxe9g,1965
419
427
  omlish/lang/attrstorage.py,sha256=UUnoENCMQF3twBfxBcIKa5mpXsAxWnNYDayhU8xgmpU,5224
420
428
  omlish/lang/casing.py,sha256=dmk6gPwfr7Tqp3g2d8d_zZ8ir8TWvXHCEZYl-ECkJS0,4940
@@ -426,7 +434,7 @@ omlish/lang/datetimes.py,sha256=01tg21QOx-PWDlm-CSFTalym3vpqF0EKzeinmtcVNoU,379
426
434
  omlish/lang/descriptors.py,sha256=sVJ1Pr4ihp26Tu9UCvDSyfSf-DhBnFGnbpYIFF32c7g,6877
427
435
  omlish/lang/enums.py,sha256=F9tflHfaAoV2MpyuhZzpfX9-H55M3zNa9hCszsngEo8,111
428
436
  omlish/lang/errors.py,sha256=shcS-NCnEUudF8qC_SmO2TQyjivKlS4TDjaz_faqQ0c,44
429
- omlish/lang/functions.py,sha256=tZL7Yi5Oy34lvzP6HhWmV5q1eg5-mk3FrWEjsmhKRhY,5707
437
+ omlish/lang/functions.py,sha256=B2Gc6TkgZcR6LhQJOCB2Wc025crQ9FmJoRlealx-Pl4,5927
430
438
  omlish/lang/generators.py,sha256=nJiSmDpsfPiypGzJ8qlOO7-BUnCsrAeDow9mhtGgBio,5196
431
439
  omlish/lang/iterables.py,sha256=o_s8ouaJrdUqEVl2_bzJk5CVdabmrywXY0gPn7xss3w,3371
432
440
  omlish/lang/lazyglobals.py,sha256=5v4S0YSUrxdZFC6znrWolfeheArMa_DEJEcz46XCQN4,2676
@@ -435,7 +443,7 @@ omlish/lang/maysync.py,sha256=S2Q_rGC4AxRa1UsGJdSzZsYpgOcX9Y8ZmYGA9v8OWn8,1635
435
443
  omlish/lang/objects.py,sha256=JMOZU5I6sK4rJm04898dOJkvef-lDIh5O3k6tlLbBJw,4616
436
444
  omlish/lang/outcomes.py,sha256=rCyjWjElNheJ-sQhauxfERT98IZ0mrUoaSI9nMpJZTg,8751
437
445
  omlish/lang/overrides.py,sha256=IBzK6ljfLX6TLgIyKTSjhqTLcuKRkQNVtEOnBLS4nuA,2095
438
- omlish/lang/params.py,sha256=sfbNoGrKCsAtubFufj_uh_WKshIgA8fqJ4PmLH1PH00,6639
446
+ omlish/lang/params.py,sha256=LKr-9ykn-SyF1Af2KSH-qKKnTU_U6dybTg4pmBzAvz0,7077
439
447
  omlish/lang/recursion.py,sha256=tfCCe4poGcyV56Wj7j9NBjm7akp828mBZegJpm-i9SU,1899
440
448
  omlish/lang/resolving.py,sha256=nMosn-rcYjI8t6b35oICDyPw6t6-HvWj5jMdkfn1jfA,1612
441
449
  omlish/lang/resources.py,sha256=awfh33Uxkd9Ho-5Z3d9CPWQE3gjktV0XWM6XbdG0ejA,2845
@@ -831,9 +839,9 @@ omlish/typedvalues/marshal.py,sha256=2xqX6JllhtGpmeYkU7C-qzgU__0x-vd6CzYbAsocQlc
831
839
  omlish/typedvalues/of_.py,sha256=UXkxSj504WI2UrFlqdZJbu2hyDwBhL7XVrc2qdR02GQ,1309
832
840
  omlish/typedvalues/reflect.py,sha256=PAvKW6T4cW7u--iX80w3HWwZUS3SmIZ2_lQjT65uAyk,1026
833
841
  omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
834
- omlish-0.0.0.dev468.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
835
- omlish-0.0.0.dev468.dist-info/METADATA,sha256=HSlC60OEdYHNi6x1X5xQznGGPwJyx3qBuHjhB9OR9Xk,18999
836
- omlish-0.0.0.dev468.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
837
- omlish-0.0.0.dev468.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
838
- omlish-0.0.0.dev468.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
839
- omlish-0.0.0.dev468.dist-info/RECORD,,
842
+ omlish-0.0.0.dev470.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
843
+ omlish-0.0.0.dev470.dist-info/METADATA,sha256=Peyq-X7o-fd7UGpjw1lWUeSRESH7QHk1xpR_bXoYscw,18999
844
+ omlish-0.0.0.dev470.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
845
+ omlish-0.0.0.dev470.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
846
+ omlish-0.0.0.dev470.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
847
+ omlish-0.0.0.dev470.dist-info/RECORD,,