omlish 0.0.0.dev131__py3-none-any.whl → 0.0.0.dev133__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.dev131'
2
- __revision__ = 'd1c2a72e639d89e78ab32d95eaa3e46bf716249c'
1
+ __version__ = '0.0.0.dev133'
2
+ __revision__ = 'a351cfd2f4211dfabf34e559ec14459081ef5895'
3
3
 
4
4
 
5
5
  #
@@ -51,7 +51,7 @@ class Project(ProjectBase):
51
51
  ],
52
52
 
53
53
  'diag': [
54
- 'asttokens ~= 2.4',
54
+ 'asttokens ~= 3.0',
55
55
  'executing ~= 2.1',
56
56
 
57
57
  'psutil ~= 6.0',
@@ -71,7 +71,7 @@ class Project(ProjectBase):
71
71
  ],
72
72
 
73
73
  'http': [
74
- 'httpx[http2] ~= 0.27',
74
+ 'httpx[http2] ~= 0.28',
75
75
  ],
76
76
 
77
77
  'misc': [
@@ -39,6 +39,14 @@ class ExitStacked:
39
39
  ##
40
40
 
41
41
 
42
+ @contextlib.contextmanager
43
+ def defer(fn: ta.Callable) -> ta.Generator[ta.Callable, None, None]:
44
+ try:
45
+ yield fn
46
+ finally:
47
+ fn()
48
+
49
+
42
50
  @contextlib.contextmanager
43
51
  def attr_setting(obj, attr, val, *, default=None): # noqa
44
52
  not_set = object()
@@ -47,19 +47,40 @@ if sys.platform == 'darwin' or sys.platform.startswith('freebsd'):
47
47
  #
48
48
 
49
49
  def _register_readable(self, fd: int) -> None:
50
- self._control(fd, select.KQ_FILTER_READ, select.KQ_EV_ADD)
50
+ self._update_registration(fd, 'read', 'add')
51
51
 
52
52
  def _register_writable(self, fd: int) -> None:
53
- self._control(fd, select.KQ_FILTER_WRITE, select.KQ_EV_ADD)
53
+ self._update_registration(fd, 'write', 'add')
54
54
 
55
55
  def _unregister_readable(self, fd: int) -> None:
56
- self._control(fd, select.KQ_FILTER_READ, select.KQ_EV_DELETE)
56
+ self._update_registration(fd, 'read', 'del')
57
57
 
58
58
  def _unregister_writable(self, fd: int) -> None:
59
- self._control(fd, select.KQ_FILTER_WRITE, select.KQ_EV_DELETE)
59
+ self._update_registration(fd, 'write', 'del')
60
60
 
61
- def _control(self, fd: int, filter: int, flags: int) -> None: # noqa
62
- ke = select.kevent(fd, filter=filter, flags=flags)
61
+ #
62
+
63
+ _CONTROL_FILTER_BY_READ_OR_WRITE: ta.ClassVar[ta.Mapping[ta.Literal['read', 'write'], int]] = {
64
+ 'read': select.KQ_FILTER_READ,
65
+ 'write': select.KQ_FILTER_WRITE,
66
+ }
67
+
68
+ _CONTROL_FLAGS_BY_ADD_OR_DEL: ta.ClassVar[ta.Mapping[ta.Literal['add', 'del'], int]] = {
69
+ 'add': select.KQ_EV_ADD,
70
+ 'del': select.KQ_EV_DELETE,
71
+ }
72
+
73
+ def _update_registration(
74
+ self,
75
+ fd: int,
76
+ read_or_write: ta.Literal['read', 'write'],
77
+ add_or_del: ta.Literal['add', 'del'],
78
+ ) -> None: # noqa
79
+ ke = select.kevent(
80
+ fd,
81
+ filter=self._CONTROL_FILTER_BY_READ_OR_WRITE[read_or_write],
82
+ flags=self._CONTROL_FLAGS_BY_ADD_OR_DEL[add_or_del],
83
+ )
63
84
  kq = self._get_kqueue()
64
85
  try:
65
86
  kq.control([ke], 0)
@@ -70,7 +91,8 @@ if sys.platform == 'darwin' or sys.platform.startswith('freebsd'):
70
91
  pass
71
92
  elif exc.errno == errno.ENOENT:
72
93
  # Can happen when trying to remove an already closed socket
73
- pass
94
+ if add_or_del == 'add':
95
+ raise
74
96
  else:
75
97
  raise
76
98
 
@@ -42,16 +42,16 @@ class FdIoPoller(abc.ABC):
42
42
  def register_readable(self, fd: int) -> bool:
43
43
  if fd in self._readable:
44
44
  return False
45
- self._readable.add(fd)
46
45
  self._register_readable(fd)
46
+ self._readable.add(fd)
47
47
  return True
48
48
 
49
49
  @ta.final
50
50
  def register_writable(self, fd: int) -> bool:
51
51
  if fd in self._writable:
52
52
  return False
53
- self._writable.add(fd)
54
53
  self._register_writable(fd)
54
+ self._writable.add(fd)
55
55
  return True
56
56
 
57
57
  @ta.final
@@ -155,24 +155,24 @@ if hasattr(select, 'poll'):
155
155
 
156
156
  #
157
157
 
158
- _READ = select.POLLIN | select.POLLPRI | select.POLLHUP
159
- _WRITE = select.POLLOUT
160
-
161
158
  def _register_readable(self, fd: int) -> None:
162
- self._update_registration(fd)
159
+ self._update_registration(fd, r=True, w=fd in self._writable)
163
160
 
164
161
  def _register_writable(self, fd: int) -> None:
165
- self._update_registration(fd)
162
+ self._update_registration(fd, r=fd in self._readable, w=True)
166
163
 
167
164
  def _unregister_readable(self, fd: int) -> None:
168
- self._update_registration(fd)
165
+ self._update_registration(fd, r=False, w=False)
169
166
 
170
167
  def _unregister_writable(self, fd: int) -> None:
171
- self._update_registration(fd)
168
+ self._update_registration(fd, r=fd in self._readable, w=False)
169
+
170
+ #
171
+
172
+ _READ = select.POLLIN | select.POLLPRI | select.POLLHUP
173
+ _WRITE = select.POLLOUT
172
174
 
173
- def _update_registration(self, fd: int) -> None:
174
- r = fd in self._readable
175
- w = fd in self._writable
175
+ def _update_registration(self, fd: int, *, r: bool, w: bool) -> None:
176
176
  if r or w:
177
177
  self._poller.register(fd, (self._READ if r else 0) | (self._WRITE if w else 0))
178
178
  else:
@@ -2,11 +2,6 @@ from .inspect import ( # noqa
2
2
  get_annotations,
3
3
  )
4
4
 
5
- from .isinstance import ( # noqa
6
- KNOWN_ISINSTANCE_GENERICS,
7
- isinstance_of,
8
- )
9
-
10
5
  from .ops import ( # noqa
11
6
  get_concrete_type,
12
7
  get_underlying,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev131
3
+ Version: 0.0.0.dev133
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -21,7 +21,7 @@ Requires-Dist: trio-asyncio~=0.15; extra == "all"
21
21
  Requires-Dist: lz4~=4.3; extra == "all"
22
22
  Requires-Dist: python-snappy~=0.7; extra == "all"
23
23
  Requires-Dist: zstandard~=0.23; extra == "all"
24
- Requires-Dist: asttokens~=2.4; extra == "all"
24
+ Requires-Dist: asttokens~=3.0; extra == "all"
25
25
  Requires-Dist: executing~=2.1; extra == "all"
26
26
  Requires-Dist: psutil~=6.0; extra == "all"
27
27
  Requires-Dist: orjson~=3.10; extra == "all"
@@ -30,7 +30,7 @@ Requires-Dist: json5~=0.9; extra == "all"
30
30
  Requires-Dist: pyyaml~=6.0; extra == "all"
31
31
  Requires-Dist: cbor2~=5.6; extra == "all"
32
32
  Requires-Dist: cloudpickle~=3.1; extra == "all"
33
- Requires-Dist: httpx[http2]~=0.27; extra == "all"
33
+ Requires-Dist: httpx[http2]~=0.28; extra == "all"
34
34
  Requires-Dist: wrapt~=1.14; extra == "all"
35
35
  Requires-Dist: cryptography~=43.0; extra == "all"
36
36
  Requires-Dist: sqlalchemy[asyncio]~=2.0; extra == "all"
@@ -45,7 +45,7 @@ Requires-Dist: duckdb~=1.1; extra == "all"
45
45
  Requires-Dist: pytest~=8.0; extra == "all"
46
46
  Requires-Dist: anyio~=4.6; extra == "all"
47
47
  Requires-Dist: sniffio~=1.3; extra == "all"
48
- Requires-Dist: asttokens~=2.4; extra == "all"
48
+ Requires-Dist: asttokens~=3.0; extra == "all"
49
49
  Requires-Dist: executing~=2.1; extra == "all"
50
50
  Requires-Dist: orjson~=3.10; extra == "all"
51
51
  Requires-Dist: pyyaml~=6.0; extra == "all"
@@ -61,7 +61,7 @@ Requires-Dist: lz4~=4.3; extra == "compress"
61
61
  Requires-Dist: python-snappy~=0.7; extra == "compress"
62
62
  Requires-Dist: zstandard~=0.23; extra == "compress"
63
63
  Provides-Extra: diag
64
- Requires-Dist: asttokens~=2.4; extra == "diag"
64
+ Requires-Dist: asttokens~=3.0; extra == "diag"
65
65
  Requires-Dist: executing~=2.1; extra == "diag"
66
66
  Requires-Dist: psutil~=6.0; extra == "diag"
67
67
  Provides-Extra: formats
@@ -72,7 +72,7 @@ Requires-Dist: pyyaml~=6.0; extra == "formats"
72
72
  Requires-Dist: cbor2~=5.6; extra == "formats"
73
73
  Requires-Dist: cloudpickle~=3.1; extra == "formats"
74
74
  Provides-Extra: http
75
- Requires-Dist: httpx[http2]~=0.27; extra == "http"
75
+ Requires-Dist: httpx[http2]~=0.28; extra == "http"
76
76
  Provides-Extra: misc
77
77
  Requires-Dist: wrapt~=1.14; extra == "misc"
78
78
  Provides-Extra: secrets
@@ -93,7 +93,7 @@ Requires-Dist: pytest~=8.0; extra == "testing"
93
93
  Provides-Extra: plus
94
94
  Requires-Dist: anyio~=4.6; extra == "plus"
95
95
  Requires-Dist: sniffio~=1.3; extra == "plus"
96
- Requires-Dist: asttokens~=2.4; extra == "plus"
96
+ Requires-Dist: asttokens~=3.0; extra == "plus"
97
97
  Requires-Dist: executing~=2.1; extra == "plus"
98
98
  Requires-Dist: orjson~=3.10; extra == "plus"
99
99
  Requires-Dist: pyyaml~=6.0; extra == "plus"
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=CxGnj-UiRPlZgmgWoovDWrOnqpSEmBy_kqA7cdfSA3w,1431
2
- omlish/__about__.py,sha256=d7BMVkW2N3aBZ6Tdsm0Fd2b0CcKLA6TPpoZPJHMAGDM,3379
2
+ omlish/__about__.py,sha256=Tilu--8fQmtMb42XpjYRk2DDowEQW1wSoTUKrA-9S7s,3379
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/argparse.py,sha256=cqKGAqcxuxv_s62z0gq29L9KAvg_3-_rFvXKjVpRJjo,8126
5
5
  omlish/c3.py,sha256=ubu7lHwss5V4UznbejAI0qXhXahrU01MysuHOZI9C4U,8116
@@ -301,7 +301,7 @@ omlish/lifecycles/transitions.py,sha256=qQtFby-h4VzbvgaUqT2NnbNumlcOx9FVVADP9t83
301
301
  omlish/lite/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
302
302
  omlish/lite/cached.py,sha256=Fs-ljXVJmHBjAaHc-JuJXMEV4MNSX5c_KHZIM3AEaIw,694
303
303
  omlish/lite/check.py,sha256=pQC412ffe_Zh7eHa4C1UYn6fA71Ls1vpVM0ZIOroPAY,1765
304
- omlish/lite/contextmanagers.py,sha256=_jfNdpYvxkbKwyjQLbK-o69W89GoEuUfl_NrCosE9lU,1308
304
+ omlish/lite/contextmanagers.py,sha256=DRarS2gx15tbse1YzyI8ZLdBmWYjFgmKPe-i4CSNDYg,1458
305
305
  omlish/lite/docker.py,sha256=3IVZZtIm7-UdB2SwArmN_MosTva1_KifyYp3YWjODbE,337
306
306
  omlish/lite/inject.py,sha256=aRRmFb6azTKF208ogYwVCEopNZx7496Ta1GZmL_IKBA,23716
307
307
  omlish/lite/io.py,sha256=3ECgUXdRnXyS6pGTSoVr6oB4moI38EpWxTq08zaTM-U,5339
@@ -322,9 +322,9 @@ omlish/lite/typing.py,sha256=U3-JaEnkDSYxK4tsu_MzUn3RP6qALBe5FXQXpD-licE,1090
322
322
  omlish/lite/fdio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
323
323
  omlish/lite/fdio/corohttp.py,sha256=5kzuM1cssA2D7rfknHFxylpjBNfA5tQSPkIRY2Ilapo,3825
324
324
  omlish/lite/fdio/handlers.py,sha256=ukUiwF8-UCr4mzTTfOaTipC0k3k7THiHnohVdYfH69o,1341
325
- omlish/lite/fdio/kqueue.py,sha256=4SvSMwNdkXpQbkMhyLqiZIjFGPUGSgD22yr9mpxT2fk,3153
325
+ omlish/lite/fdio/kqueue.py,sha256=lIWvvRpRyak0dmzE6FPtCdS02HGo0EEI0D1g8cWyLYk,3832
326
326
  omlish/lite/fdio/manager.py,sha256=-gMVzk4B1YTZS-d2TdM12woUme37pcNVUxNTiLe91lA,1250
327
- omlish/lite/fdio/pollers.py,sha256=zSFi19SGQ2WKtMO_ONiqaJ_mbQmhrK59zgH5CqMYcu8,5434
327
+ omlish/lite/fdio/pollers.py,sha256=d73P2ynzFdQZhmxhMKghzO6zvLwzTMSaIgBi7wQ5IQs,5507
328
328
  omlish/lite/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
329
329
  omlish/lite/http/coroserver.py,sha256=aBaYjP80yQHQxPxwi7PTYHub-fdRDKsMnB-tM8lBc2o,18095
330
330
  omlish/lite/http/handlers.py,sha256=Yu0P3nqz-frklwCM2PbiWvoJNE-NqeTFLBvpNpqcdtA,753
@@ -371,9 +371,8 @@ omlish/math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
371
371
  omlish/math/bits.py,sha256=yip1l8agOYzT7bFyMGc0RR3XlnGCfHMpjw_SECLLh1I,3477
372
372
  omlish/math/floats.py,sha256=UimhOT7KRl8LXTzOI5cQWoX_9h6WNWe_3vcOuO7-h_8,327
373
373
  omlish/math/stats.py,sha256=MegzKVsmv2kra4jDWLOUgV0X7Ee2Tbl5u6ql1v4-dEY,10053
374
- omlish/reflect/__init__.py,sha256=3XME1VdOmmf8Qp3e8iTcqmRw6rzFzE3HQbM8fMNqY44,807
374
+ omlish/reflect/__init__.py,sha256=4-EuCSX1qpEWfScCFzAJv_XghHFu4cXxpxKeBKrosQ4,720
375
375
  omlish/reflect/inspect.py,sha256=veJ424-9oZrqyvhVpvxOi7hcKW-PDBkdYL2yjrFlk4o,495
376
- omlish/reflect/isinstance.py,sha256=x5T9S2634leinBT4hl3CZZkRttvdvvlxChkC_x9Qu2s,1176
377
376
  omlish/reflect/ops.py,sha256=RJ6jzrM4ieFsXzWyNXWV43O_WgzEaUvlHSc5N2ezW2A,2044
378
377
  omlish/reflect/subst.py,sha256=JM2RGv2-Rcex8wCqhmgvRG59zD242P9jM3O2QLjKWWo,3586
379
378
  omlish/reflect/types.py,sha256=B1zbq3yHo6B5JeNOXbmaxm78kqZTRb_4jIWY5GxzY4Q,8155
@@ -488,9 +487,9 @@ omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,329
488
487
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
489
488
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
490
489
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
491
- omlish-0.0.0.dev131.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
492
- omlish-0.0.0.dev131.dist-info/METADATA,sha256=V7J6J12IhBiLRFrCaAkvQgvB1VPvsZSzu32VsYQGSdE,4173
493
- omlish-0.0.0.dev131.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
494
- omlish-0.0.0.dev131.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
495
- omlish-0.0.0.dev131.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
496
- omlish-0.0.0.dev131.dist-info/RECORD,,
490
+ omlish-0.0.0.dev133.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
491
+ omlish-0.0.0.dev133.dist-info/METADATA,sha256=g1UGdUXjw3xU7TVb-eOTtKUn81LYmIoKNIig-b71oRc,4173
492
+ omlish-0.0.0.dev133.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
493
+ omlish-0.0.0.dev133.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
494
+ omlish-0.0.0.dev133.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
495
+ omlish-0.0.0.dev133.dist-info/RECORD,,
@@ -1,38 +0,0 @@
1
- import collections.abc
2
- import typing as ta
3
-
4
- from .ops import get_underlying
5
- from .types import Generic
6
- from .types import NewType
7
- from .types import Type
8
- from .types import Union
9
-
10
-
11
- KNOWN_ISINSTANCE_GENERICS: ta.AbstractSet[type] = frozenset([
12
- collections.abc.Mapping,
13
- collections.abc.Sequence,
14
- collections.abc.Set,
15
- ])
16
-
17
-
18
- def isinstance_of(rfl: Type) -> ta.Callable[[ta.Any], bool]:
19
- if isinstance(rfl, type):
20
- return lambda o: isinstance(o, rfl)
21
-
22
- if isinstance(rfl, NewType):
23
- return isinstance_of(get_underlying(rfl))
24
-
25
- if isinstance(rfl, Union):
26
- fns = [isinstance_of(a) for a in rfl.args]
27
- return lambda o: any(fn(o) for fn in fns)
28
-
29
- if isinstance(rfl, Generic):
30
- if rfl.cls in (collections.abc.Sequence, collections.abc.Set):
31
- [efn] = map(isinstance_of, rfl.args)
32
- return lambda o: isinstance(o, rfl.cls) and all(efn(e) for e in o) # type: ignore
33
-
34
- if rfl.cls == collections.abc.Mapping:
35
- kfn, vfn = map(isinstance_of, rfl.args)
36
- return lambda o: isinstance(o, rfl.cls) and all(kfn(k) and vfn(v) for k, v in o.items()) # type: ignore
37
-
38
- raise TypeError(rfl)