omlish 0.0.0.dev195__py3-none-any.whl → 0.0.0.dev197__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.
Files changed (52) hide show
  1. omlish/__about__.py +3 -3
  2. omlish/asyncs/asyncio/all.py +0 -1
  3. omlish/asyncs/asyncio/asyncio.py +2 -6
  4. omlish/asyncs/bluelet/runner.py +1 -1
  5. omlish/asyncs/bridge.py +2 -2
  6. omlish/codecs/base.py +5 -5
  7. omlish/codecs/text.py +1 -2
  8. omlish/io/compress/adapters.py +4 -4
  9. omlish/io/compress/base.py +4 -4
  10. omlish/io/compress/bz2.py +4 -4
  11. omlish/io/compress/codecs.py +2 -2
  12. omlish/io/compress/gzip.py +10 -10
  13. omlish/io/compress/lz4.py +5 -5
  14. omlish/io/compress/lzma.py +4 -4
  15. omlish/io/compress/zlib.py +4 -4
  16. omlish/io/coro/__init__.py +56 -0
  17. omlish/io/coro/direct.py +13 -0
  18. omlish/io/{generators → coro}/readers.py +31 -31
  19. omlish/io/{generators → coro}/stepped.py +28 -28
  20. omlish/multiprocessing/__init__.py +32 -0
  21. omlish/{multiprocessing.py → multiprocessing/death.py} +3 -88
  22. omlish/multiprocessing/proxies.py +30 -0
  23. omlish/multiprocessing/spawn.py +59 -0
  24. omlish/os/atomics.py +2 -2
  25. omlish/outcome.py +250 -0
  26. omlish/sockets/server.py +1 -2
  27. omlish/term/vt100/terminal.py +1 -1
  28. omlish/testing/pytest/__init__.py +0 -4
  29. omlish/testing/pytest/plugins/asyncs/__init__.py +1 -0
  30. omlish/testing/pytest/plugins/asyncs/backends/__init__.py +16 -0
  31. omlish/testing/pytest/plugins/asyncs/backends/asyncio.py +35 -0
  32. omlish/testing/pytest/plugins/asyncs/backends/base.py +30 -0
  33. omlish/testing/pytest/plugins/asyncs/backends/trio.py +91 -0
  34. omlish/testing/pytest/plugins/asyncs/backends/trio_asyncio.py +89 -0
  35. omlish/testing/pytest/plugins/asyncs/consts.py +3 -0
  36. omlish/testing/pytest/plugins/asyncs/fixtures.py +273 -0
  37. omlish/testing/pytest/plugins/asyncs/plugin.py +182 -0
  38. omlish/testing/pytest/plugins/asyncs/utils.py +10 -0
  39. omlish/testing/pytest/plugins/managermarks.py +0 -14
  40. omlish/text/indent.py +1 -1
  41. omlish/text/minja.py +2 -2
  42. {omlish-0.0.0.dev195.dist-info → omlish-0.0.0.dev197.dist-info}/METADATA +5 -5
  43. {omlish-0.0.0.dev195.dist-info → omlish-0.0.0.dev197.dist-info}/RECORD +48 -36
  44. {omlish-0.0.0.dev195.dist-info → omlish-0.0.0.dev197.dist-info}/WHEEL +1 -1
  45. omlish/io/generators/__init__.py +0 -56
  46. omlish/io/generators/direct.py +0 -13
  47. omlish/testing/pytest/marks.py +0 -18
  48. omlish/testing/pytest/plugins/asyncs.py +0 -162
  49. /omlish/io/{generators → coro}/consts.py +0 -0
  50. {omlish-0.0.0.dev195.dist-info → omlish-0.0.0.dev197.dist-info}/LICENSE +0 -0
  51. {omlish-0.0.0.dev195.dist-info → omlish-0.0.0.dev197.dist-info}/entry_points.txt +0 -0
  52. {omlish-0.0.0.dev195.dist-info → omlish-0.0.0.dev197.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,182 @@
1
+ """
2
+ TODO:
3
+ - auto drain_asyncio
4
+ """
5
+ import contextvars
6
+ import functools
7
+ import sys
8
+ import typing as ta
9
+ import warnings
10
+
11
+ import pytest
12
+ from _pytest.outcomes import Skipped # noqa
13
+ from _pytest.outcomes import XFailed # noqa
14
+
15
+ from ..... import check
16
+ from ..... import lang
17
+ from .._registry import register
18
+ from .backends import ASYNC_BACKENDS
19
+ from .backends import AsyncsBackend
20
+ from .consts import ASYNCS_MARK
21
+ from .consts import PARAM_NAME
22
+ from .fixtures import CANARY
23
+ from .fixtures import AsyncsFixture
24
+ from .fixtures import AsyncsTestContext
25
+ from .fixtures import is_asyncs_fixture
26
+ from .utils import is_async_function
27
+ from .utils import is_coroutine_function
28
+
29
+
30
+ if ta.TYPE_CHECKING:
31
+ import anyio
32
+ else:
33
+ anyio = lang.proxy_import('anyio')
34
+
35
+
36
+ ##
37
+
38
+
39
+ @register
40
+ class AsyncsPlugin:
41
+ def __init__(self, backends: ta.Collection[type[AsyncsBackend]] | None = None) -> None:
42
+ super().__init__()
43
+
44
+ if backends is None:
45
+ backends = ASYNC_BACKENDS
46
+
47
+ bd: dict[str, AsyncsBackend] = {}
48
+ for bc in backends:
49
+ be = bc()
50
+ if not be.is_available():
51
+ continue
52
+ bn = be.name
53
+ check.not_in(bn, bd)
54
+ bd[bn] = be
55
+ self._backends = bd
56
+
57
+ def pytest_cmdline_main(self, config):
58
+ if (aio_plugin := sys.modules.get('pytest_asyncio.plugin')):
59
+ # warnings.filterwarnings is clobbered by pytest using warnings.catch_warnings
60
+ def aio_plugin_warn(message, *args, **kwargs):
61
+ if (
62
+ isinstance(message, pytest.PytestDeprecationWarning) and
63
+ message.args[0].startswith('The configuration option "asyncio_default_fixture_loop_scope" is unset.') # noqa
64
+ ):
65
+ return
66
+ warnings.warn(message, *args, **kwargs)
67
+
68
+ aio_plugin.warnings = lang.proxy_import('warnings') # type: ignore
69
+ aio_plugin.warnings.warn = aio_plugin_warn # type: ignore
70
+
71
+ def pytest_configure(self, config):
72
+ config.addinivalue_line('markers', f'{ASYNCS_MARK}: marks for all async backends')
73
+
74
+ def pytest_generate_tests(self, metafunc):
75
+ if (m := metafunc.definition.get_closest_marker(ASYNCS_MARK)) is not None:
76
+ if m.args:
77
+ bns = m.args
78
+ else:
79
+ bns = list(self._backends)
80
+ else:
81
+ return
82
+
83
+ for bn in bns:
84
+ be = self._backends[bn]
85
+ be.prepare_for_metafunc(metafunc)
86
+
87
+ metafunc.fixturenames.append(PARAM_NAME)
88
+ metafunc.parametrize(PARAM_NAME, bns)
89
+
90
+ def pytest_fixture_setup(self, fixturedef, request):
91
+ is_asyncs_test = request.node.get_closest_marker(ASYNCS_MARK) is not None
92
+
93
+ kwargs = {name: request.getfixturevalue(name) for name in fixturedef.argnames}
94
+
95
+ if not is_asyncs_fixture(fixturedef.func, is_asyncs_test, kwargs):
96
+ return None
97
+
98
+ if request.scope != 'function':
99
+ raise RuntimeError('Asyncs fixtures must be function-scope')
100
+
101
+ if not is_asyncs_test:
102
+ raise RuntimeError('Asyncs fixtures can only be used by Asyncs tests')
103
+
104
+ fixture = AsyncsFixture(
105
+ '<fixture {!r}>'.format(fixturedef.argname), # noqa
106
+ fixturedef.func,
107
+ kwargs,
108
+ )
109
+
110
+ fixturedef.cached_result = (fixture, request.param_index, None)
111
+
112
+ return fixture
113
+
114
+ @pytest.hookimpl(hookwrapper=True)
115
+ def pytest_runtest_call(self, item):
116
+ if (m := item.get_closest_marker(ASYNCS_MARK)) is None: # noqa
117
+ if is_async_function(item.obj):
118
+ from _pytest.unittest import UnitTestCase # noqa
119
+ if isinstance(item.parent, UnitTestCase):
120
+ # unittest handles these itself.
121
+ pass
122
+ else:
123
+ raise Exception(f'{item.nodeid}: async def function and no async plugin specified')
124
+
125
+ yield
126
+ return
127
+
128
+ bn = item.callspec.params[PARAM_NAME]
129
+ be = self._backends[bn]
130
+
131
+ item.obj = self.test_runner_factory(be, item)
132
+
133
+ yield
134
+
135
+ def test_runner_factory(self, backend: AsyncsBackend, item, testfunc=None):
136
+ if not testfunc:
137
+ testfunc = item.obj
138
+
139
+ if not is_coroutine_function(testfunc):
140
+ pytest.fail(f'test function `{item!r}` is marked asyncs but is not async')
141
+
142
+ @backend.wrap_runner
143
+ async def _bootstrap_fixtures_and_run_test(**kwargs):
144
+ __tracebackhide__ = True
145
+
146
+ test_ctx = AsyncsTestContext(backend)
147
+ test = AsyncsFixture(
148
+ '<test {!r}>'.format(testfunc.__name__), # noqa
149
+ testfunc,
150
+ kwargs,
151
+ is_test=True,
152
+ )
153
+
154
+ contextvars_ctx = contextvars.copy_context()
155
+ contextvars_ctx.run(CANARY.set, 'in correct context')
156
+
157
+ async with anyio.create_task_group() as nursery:
158
+ for fixture in test.register_and_collect_dependencies():
159
+ contextvars_ctx.run(
160
+ functools.partial(
161
+ nursery.start_soon,
162
+ fixture.run,
163
+ test_ctx,
164
+ contextvars_ctx,
165
+ name=fixture.name,
166
+ ),
167
+ )
168
+
169
+ silent_cancellers = test_ctx.fixtures_with_cancel - test_ctx.fixtures_with_errors
170
+
171
+ if silent_cancellers:
172
+ for fixture in silent_cancellers:
173
+ test_ctx.error_list.append(
174
+ RuntimeError(f"{fixture.name} cancelled the test but didn't raise an error"),
175
+ )
176
+
177
+ if len(test_ctx.error_list) == 1:
178
+ raise test_ctx.error_list[0]
179
+ elif test_ctx.error_list:
180
+ raise BaseExceptionGroup('errors in async test and async fixtures', test_ctx.error_list)
181
+
182
+ return _bootstrap_fixtures_and_run_test
@@ -0,0 +1,10 @@
1
+ import inspect
2
+ import typing as ta
3
+
4
+
5
+ def is_coroutine_function(func: ta.Any) -> bool:
6
+ return inspect.iscoroutinefunction(func) or getattr(func, '_is_coroutine', False)
7
+
8
+
9
+ def is_async_function(func: ta.Any) -> bool:
10
+ return is_coroutine_function(func) or inspect.isasyncgenfunction(func)
@@ -17,22 +17,8 @@ class ManagerMark(lang.Abstract):
17
17
  raise NotImplementedError
18
18
 
19
19
 
20
- def _deep_subclasses(cls):
21
- ret = set()
22
-
23
- def rec(cur):
24
- for nxt in cur.__subclasses__():
25
- if nxt not in ret:
26
- ret.add(nxt)
27
- rec(nxt)
28
-
29
- rec(cls)
30
- return ret
31
-
32
-
33
20
  @register
34
21
  class ManagerMarksPlugin:
35
-
36
22
  @lang.cached_function
37
23
  def mark_classes(self) -> ta.Mapping[str, type[ManagerMark]]:
38
24
  return {
omlish/text/indent.py CHANGED
@@ -4,7 +4,7 @@ import contextlib
4
4
  import io
5
5
  import typing as ta
6
6
 
7
- from omlish.lite.check import check
7
+ from ..lite.check import check
8
8
 
9
9
 
10
10
  class IndentWriter:
omlish/text/minja.py CHANGED
@@ -9,8 +9,8 @@ import io
9
9
  import re
10
10
  import typing as ta
11
11
 
12
- from omlish.lite.cached import cached_nullary
13
- from omlish.lite.check import check
12
+ from ..lite.cached import cached_nullary
13
+ from ..lite.check import check
14
14
 
15
15
 
16
16
  ##
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev195
3
+ Version: 0.0.0.dev197
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -13,7 +13,7 @@ Classifier: Operating System :: POSIX
13
13
  Requires-Python: >=3.12
14
14
  License-File: LICENSE
15
15
  Provides-Extra: all
16
- Requires-Dist: anyio~=4.7; extra == "all"
16
+ Requires-Dist: anyio~=4.8; extra == "all"
17
17
  Requires-Dist: sniffio~=1.3; extra == "all"
18
18
  Requires-Dist: greenlet~=3.1; extra == "all"
19
19
  Requires-Dist: trio~=0.27; extra == "all"
@@ -44,7 +44,7 @@ Requires-Dist: apsw~=3.47; extra == "all"
44
44
  Requires-Dist: sqlean.py~=3.45; extra == "all"
45
45
  Requires-Dist: duckdb~=1.1; extra == "all"
46
46
  Requires-Dist: pytest~=8.0; extra == "all"
47
- Requires-Dist: anyio~=4.7; extra == "all"
47
+ Requires-Dist: anyio~=4.8; extra == "all"
48
48
  Requires-Dist: sniffio~=1.3; extra == "all"
49
49
  Requires-Dist: asttokens~=3.0; extra == "all"
50
50
  Requires-Dist: executing~=2.1; extra == "all"
@@ -52,7 +52,7 @@ Requires-Dist: orjson~=3.10; extra == "all"
52
52
  Requires-Dist: pyyaml~=6.0; extra == "all"
53
53
  Requires-Dist: wrapt~=1.14; extra == "all"
54
54
  Provides-Extra: async
55
- Requires-Dist: anyio~=4.7; extra == "async"
55
+ Requires-Dist: anyio~=4.8; extra == "async"
56
56
  Requires-Dist: sniffio~=1.3; extra == "async"
57
57
  Requires-Dist: greenlet~=3.1; extra == "async"
58
58
  Requires-Dist: trio~=0.27; extra == "async"
@@ -93,7 +93,7 @@ Requires-Dist: duckdb~=1.1; extra == "sqldrivers"
93
93
  Provides-Extra: testing
94
94
  Requires-Dist: pytest~=8.0; extra == "testing"
95
95
  Provides-Extra: plus
96
- Requires-Dist: anyio~=4.7; extra == "plus"
96
+ Requires-Dist: anyio~=4.8; extra == "plus"
97
97
  Requires-Dist: sniffio~=1.3; extra == "plus"
98
98
  Requires-Dist: asttokens~=3.0; extra == "plus"
99
99
  Requires-Dist: executing~=2.1; extra == "plus"
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=dyIpveH7Z8OnQp2pTn6NVv7LCDXVrozJWAzbk8PBavg,7950
2
- omlish/__about__.py,sha256=KFm_YdsS-MeBxoDzviKNbBIafix8IbUprO2Yd_u0ePY,3409
2
+ omlish/__about__.py,sha256=tOVu5niNIXFKxmAD9pNMz4UGHVFnBkHV49gAq25Z_xk,3409
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=ubu7lHwss5V4UznbejAI0qXhXahrU01MysuHOZI9C4U,8116
5
5
  omlish/cached.py,sha256=UI-XTFBwA6YXWJJJeBn-WkwBkfzDjLBBaZf4nIJA9y0,510
@@ -8,7 +8,7 @@ omlish/datetimes.py,sha256=HajeM1kBvwlTa-uR1TTZHmZ3zTPnnUr1uGGQhiO1XQ0,2152
8
8
  omlish/defs.py,sha256=9uUjJuVIbCBL3g14fyzAp-9gH935MFofvlfOGwcBIaM,4913
9
9
  omlish/dynamic.py,sha256=35C_cCX_Vq2HrHzGk5T-zbrMvmUdiIiwDzDNixczoDo,6541
10
10
  omlish/libc.py,sha256=8r7Ejyhttk9ruCfBkxNTrlzir5WPbDE2vmY7VPlceMA,15362
11
- omlish/multiprocessing.py,sha256=QZT4C7I-uThCAjaEY3xgUYb-5GagUlnE4etN01LDyU4,5186
11
+ omlish/outcome.py,sha256=ABIE0zjjTyTNtn-ZqQ_9_mUzLiBQ3sDAyqc9JVD8N2k,7852
12
12
  omlish/runmodule.py,sha256=PWvuAaJ9wQQn6bx9ftEL3_d04DyotNn8dR_twm2pgw0,700
13
13
  omlish/shlex.py,sha256=bsW2XUD8GiMTUTDefJejZ5AyqT1pTgWMPD0BMoF02jE,248
14
14
  omlish/subprocesses.py,sha256=KOvt5gvpq2uisjYKyU_XUPZyM6yq8ywgbfWjz-lx9CQ,8686
@@ -88,13 +88,13 @@ omlish/asyncs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
88
  omlish/asyncs/all.py,sha256=uUz9ziKh4_QrgmdhKFMgq6j7mFbiZd3LiogguDCQsGI,587
89
89
  omlish/asyncs/anyio.py,sha256=gfpx-D8QGmUfhnQxHEaHXcAP8zSMQjcGw4COFTGNnHI,8021
90
90
  omlish/asyncs/asyncs.py,sha256=Tf7ZodTGepkM7HAuFcDNh9lLzzrMw6rELWvopGmFkh4,2035
91
- omlish/asyncs/bridge.py,sha256=GJOjXVwZJvpq2q9rCwRI2u7Tg-KLUx-SY92b873-M4c,9738
91
+ omlish/asyncs/bridge.py,sha256=zVAhbFVDvw3qJjcvOKKY2mI8AwrmcmddKsW9KIzPdLI,9740
92
92
  omlish/asyncs/flavors.py,sha256=1mNxGNRVmjUHzA13K5ht8vdJv4CLEmzYTQ6BZXr1520,4866
93
93
  omlish/asyncs/trio.py,sha256=fmZ5b_lKdVV8NQ3euCUutWgnkqTFzSnOjvJSA_jvmrE,367
94
94
  omlish/asyncs/trio_asyncio.py,sha256=oqdOHy0slj9PjVxaDf3gJkq9AAgg7wYZbB469jOftVw,1327
95
95
  omlish/asyncs/asyncio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
- omlish/asyncs/asyncio/all.py,sha256=cyfe1tOXxQYmgfyF9X1dwx0LPQ0Gsub3tFFZGjWGMr8,142
97
- omlish/asyncs/asyncio/asyncio.py,sha256=JfM59QgB3asgEbrps0zoVbNjWD4kL2XdsEkRMEIoFos,971
96
+ omlish/asyncs/asyncio/all.py,sha256=eZDtL8atzHqIdGCAAcQYWVmNvgRYerJB9Sy0reh-09k,115
97
+ omlish/asyncs/asyncio/asyncio.py,sha256=fvIc3M01Bo_qZTFz3Z2X7NrXC_9DnS0vtZKizGiV034,830
98
98
  omlish/asyncs/asyncio/channels.py,sha256=ZbmsEmdK1fV96liHdcVpRqA2dAMkXJt4Q3rFAg3YOIw,1074
99
99
  omlish/asyncs/asyncio/streams.py,sha256=Uc9PCWSfBqrK2kdVtfjjQU1eaYTWYmZm8QISDj2xiuw,1004
100
100
  omlish/asyncs/asyncio/subprocesses.py,sha256=XlIWwSxpVB7sMVc75-f7dI6r08JkdipNFRWXUKS8zAw,6960
@@ -106,7 +106,7 @@ omlish/asyncs/bluelet/api.py,sha256=yeM5SauiIbvKj26mDdxn5mOj8s5fFIw2xBSe-P6HVC0,
106
106
  omlish/asyncs/bluelet/core.py,sha256=NpGQhb865aeXPKV_67l-6FiuQzdDJJ85zjfvCR5R8Pc,5430
107
107
  omlish/asyncs/bluelet/events.py,sha256=iXpRWmy64YcshT_nuyiJ39jbketZdtj8LrdlX3JmpoY,2440
108
108
  omlish/asyncs/bluelet/files.py,sha256=pgcLV_3oGbpqQmOrii8SeizyYLp8XKofQJhqM82RlKw,2389
109
- omlish/asyncs/bluelet/runner.py,sha256=cwgVjwRRXzqfOqRD0rkPHjt_Udyt9ZKpVs36uAJ_Q7c,15473
109
+ omlish/asyncs/bluelet/runner.py,sha256=F6Ep0th09f-FkIRJfMN3_u-iG21jNNv11WyqnHyITYU,15475
110
110
  omlish/asyncs/bluelet/sockets.py,sha256=RrC2vU52dOEBYKzvoh1qA39uUE8p3uCB_oxnhaP1AeA,6752
111
111
  omlish/bootstrap/__init__.py,sha256=-Rtsg7uPQNhh1dIT9nqrz96XlqizwoLnWf-FwOEstJI,730
112
112
  omlish/bootstrap/__main__.py,sha256=4jCwsaogp0FrJjJZ85hzF4-WqluPeheHbfeoKynKvNs,194
@@ -117,13 +117,13 @@ omlish/bootstrap/main.py,sha256=yZhOHDDlj4xB5a89dRdT8z58FsqqnpoBg1-tvY2CJe4,5903
117
117
  omlish/bootstrap/marshal.py,sha256=ZxdAeMNd2qXRZ1HUK89HmEhz8tqlS9OduW34QBscKw0,516
118
118
  omlish/bootstrap/sys.py,sha256=aqMzxZa_lPj78cgz4guYZAkjT6En32e2LptfEo20NIM,8769
119
119
  omlish/codecs/__init__.py,sha256=-FDwRJFGagg-fZyQ8wup4GPuR6gHpmaChzthlykn-kY,876
120
- omlish/codecs/base.py,sha256=JXTFSLnX5qPbi4NSbbI5uB3tYhs2SN0g_eWN2UskPYE,2242
120
+ omlish/codecs/base.py,sha256=uFrDvP7SZdeBbpuUzGHvyOdFNAmhjkBG2cVaVydRsjw,2221
121
121
  omlish/codecs/bytes.py,sha256=jlZ87OmZ52HhQDNyL87R3OIviK2qV5iU2jZYOTOLWjk,2157
122
122
  omlish/codecs/chain.py,sha256=DrBi5vbaFfObfoppo6alwOmyW2XbrH2051cjExwr2Gs,527
123
123
  omlish/codecs/funcs.py,sha256=p4imNt7TobyZVXWC-WhntHVu9KfJrO4QwdtPRh-cVOk,850
124
124
  omlish/codecs/registry.py,sha256=8ySUG-kwGJoUN1HCRnz8VjcykB0wlIzoWF5WTAE1ny0,3860
125
125
  omlish/codecs/standard.py,sha256=eiZ4u9ep0XrA4Z_D1zJI0vmWyuN8HLrX4Se_r_Cq_ZM,60
126
- omlish/codecs/text.py,sha256=8inuZbi_ODJB4G6eZfj2wBvCLgtpvhcTebKdGSori5c,5728
126
+ omlish/codecs/text.py,sha256=JzrdwMpQPo2NBBg3K1EZszzQy5vEWmd82SIerJd4yeQ,5723
127
127
  omlish/collections/__init__.py,sha256=zeUvcAz073ekko37QKya6sElTMfKTuF1bKrdbMtaRpI,2142
128
128
  omlish/collections/abc.py,sha256=sP7BpTVhx6s6C59mTFeosBi4rHOWC6tbFBYbxdZmvh0,2365
129
129
  omlish/collections/coerce.py,sha256=g68ROb_-5HgH-vI8612mU2S0FZ8-wp2ZHK5_Zy_kVC0,7037
@@ -329,27 +329,27 @@ omlish/io/pyio.py,sha256=q4RBFVpBE5PYjnGPGT-_4pcZb7dFJmLJ4LtI8OoDRQY,95433
329
329
  omlish/io/trampoline.py,sha256=oUKTQg1F5xQS1431Kt7MbK-NZpX509ubcXU-s86xJr8,7171
330
330
  omlish/io/compress/__init__.py,sha256=qV-aDfPWykTMYcoQmE8THZ4KFDRzqwN3QPPNEJVarXY,86
331
331
  omlish/io/compress/abc.py,sha256=P9YoQX8XYoq2UfBsinKLUuwwqV1ODUIJzjTraRWGF1M,3090
332
- omlish/io/compress/adapters.py,sha256=DQvbiqTiaVE-GsawpOpUTX07Gjg125Iuwd6IhjuSaxE,6180
333
- omlish/io/compress/base.py,sha256=yx8ifzs_j8y66gMCQcssjZ936NNBFhYn_kBRwNh3SWQ,647
332
+ omlish/io/compress/adapters.py,sha256=LJHhjwMHXstoLyX_q0QhGoBAcqyYGWfzhzQbGBXHzHY,6148
333
+ omlish/io/compress/base.py,sha256=zwPnicyrEY-zersxdhxGHXxn02ycl8ew2uZXEecJea4,615
334
334
  omlish/io/compress/brotli.py,sha256=Q2t9uRqBEgRyJCSPsTaJv5w7d-rhsjDMluA4VRBHa_A,1182
335
- omlish/io/compress/bz2.py,sha256=2ULaZwcpAkHKV-JargrLoXgL9G-gxrVnPqE_pGqNUrg,1566
336
- omlish/io/compress/codecs.py,sha256=ySLHZdNKLx_CiBW9aGIu0gHbALGzF-uyH0usloU7s-8,1820
337
- omlish/io/compress/gzip.py,sha256=ZKZdg0wg_nIgFdkfemOv8xZpHneBXZAiCH0n6gIibWY,12281
338
- omlish/io/compress/lz4.py,sha256=4kppXZCXpSAQw6wJvCs9LLHFzukekENja7RiwmN8uMc,2790
339
- omlish/io/compress/lzma.py,sha256=4bWNKk7uTFiRT_HogW2ZldgaNy1IukmqfVDVkf5M2Ok,2501
335
+ omlish/io/compress/bz2.py,sha256=HtwBuBYHJ3MyWO9xJ0XhWpyIYTA3OszLrpu_J4kRRPA,1534
336
+ omlish/io/compress/codecs.py,sha256=VBc_MAz0W8lVKTKavot3aVKOuPmEUquzarMtpyuteiU,1804
337
+ omlish/io/compress/gzip.py,sha256=tSjZmLWc7BZugYhmv07Pjr_TaVD1X-0JnZIlAk67iyQ,12213
338
+ omlish/io/compress/lz4.py,sha256=qaze1yVXexjJyN18Adh8fbTm_5pEeyytx66KoMUNpCU,2759
339
+ omlish/io/compress/lzma.py,sha256=qDyshBgBUSPcZpAyXiRXnqI7zx7x60UpPxn8K3nN8aM,2469
340
340
  omlish/io/compress/snappy.py,sha256=JFoH_9l0Tr9AGaQ0jHRiP4TsFnG071l27mprCBcqt4c,704
341
- omlish/io/compress/zlib.py,sha256=BQ0BvX-wEN-0NwktcqFECYHTGwVe-VHCVCNarspGQ8o,2396
341
+ omlish/io/compress/zlib.py,sha256=dE38zBY4qNihUYtPjSpNRXweiw6mB6xsYqsBJklTDXM,2364
342
342
  omlish/io/compress/zstd.py,sha256=wik_HWLq_8fGAJgGyMGq9fhFQovot1aCH4lwMpihQmg,949
343
+ omlish/io/coro/__init__.py,sha256=cfeng1ESiMlCU_ubI1aWcBD9IK0Im7emOTsggmlEjtI,1046
344
+ omlish/io/coro/consts.py,sha256=4r6IMLBMic6MJHVn9UiORIkkPAuxsqtzFT3KV0fatC0,33
345
+ omlish/io/coro/direct.py,sha256=Y--rP3wvBAYMeYctokb5IGd8UyQGmEFChyKISmRg5k0,294
346
+ omlish/io/coro/readers.py,sha256=9VcXuBQ7BSoFen8UVuYFwnl2jJVjyilWV7QeqLNQtKU,4131
347
+ omlish/io/coro/stepped.py,sha256=eAppRniUZ00rk3goWLU4zsd52MhZB2_YrOmFqs3RfR4,4929
343
348
  omlish/io/fdio/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
344
349
  omlish/io/fdio/handlers.py,sha256=VDPEff3yXPnCj2jZEkrzuI42bKC8wD8fLmOG97hKrgo,1350
345
350
  omlish/io/fdio/kqueue.py,sha256=YgGBQibkAUYODYDiGl7Enjtx1oQsJXuDsBLBXgqlLQw,3832
346
351
  omlish/io/fdio/manager.py,sha256=q4wWf7nKrNtjx6yPEvrVnFt4UtK_BTvVlquEGw7poEo,1250
347
352
  omlish/io/fdio/pollers.py,sha256=yNadAt3W5wd90PFmd3vD77bq5QwoVb2A6SM2JjZpKRs,5507
348
- omlish/io/generators/__init__.py,sha256=YsSLJY9uw72eX3iXd_A0pM69g7EvEqMFdCdR_BBD4RA,1216
349
- omlish/io/generators/consts.py,sha256=4r6IMLBMic6MJHVn9UiORIkkPAuxsqtzFT3KV0fatC0,33
350
- omlish/io/generators/direct.py,sha256=A9VJB1rNKU3l-NatpYIwyCLI3R_ybGglmdx6sAtoTo4,324
351
- omlish/io/generators/readers.py,sha256=MolTFCzcnD5XoP0su0YUNHJ0xlHC3KTihvWAi75y8Bo,4336
352
- omlish/io/generators/stepped.py,sha256=WZnLpCzv5pA6jLdb1lplXoKRPbREw9wO586Dew5EzV4,5129
353
353
  omlish/iterators/__init__.py,sha256=yMavf5FofiS1EU4UFuWPXiFZ03W0H-y7MuMxW8FUaEE,358
354
354
  omlish/iterators/iterators.py,sha256=ghI4dO6WPyyFOLTIIMaHQ_IOy2xXaFpGPqveZ5YGIBU,3158
355
355
  omlish/iterators/recipes.py,sha256=53mkexitMhkwXQZbL6DrhpT0WePQ_56uXd5Jaw3DfzI,467
@@ -457,8 +457,12 @@ omlish/math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
457
457
  omlish/math/bits.py,sha256=yip1l8agOYzT7bFyMGc0RR3XlnGCfHMpjw_SECLLh1I,3477
458
458
  omlish/math/floats.py,sha256=UimhOT7KRl8LXTzOI5cQWoX_9h6WNWe_3vcOuO7-h_8,327
459
459
  omlish/math/stats.py,sha256=MegzKVsmv2kra4jDWLOUgV0X7Ee2Tbl5u6ql1v4-dEY,10053
460
+ omlish/multiprocessing/__init__.py,sha256=hFAym2y_ws4JUMiB216J45LDajrlnfAqsTq214gvHFc,588
461
+ omlish/multiprocessing/death.py,sha256=_JV88yxwYIalamIMuqmGTQ4KYd0t-UHLjVkdoliPWL8,2943
462
+ omlish/multiprocessing/proxies.py,sha256=bInhGds2rv6xT9q3qRMlZuSXFAjwfspkiohXZ36aUpY,484
463
+ omlish/multiprocessing/spawn.py,sha256=sTvPLIJGYnjjI6ASqhFzHF-97tCnaOXX7u7s-33SUMw,1875
460
464
  omlish/os/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
461
- omlish/os/atomics.py,sha256=AKap761fcRqr44jnJNLbNwh6ju5drWJc3WWqTO0BcAs,5256
465
+ omlish/os/atomics.py,sha256=KhWNeh4mzU3M-TF0v8uR6hUqMfZJW42MeyIK9Jl6R0k,5246
462
466
  omlish/os/deathsig.py,sha256=hk9Yq2kyDdI-cI7OQH7mOfpRbOKzY_TfPKEqgrjVYbA,641
463
467
  omlish/os/files.py,sha256=1tNy1z5I_CgYKA5c6lOfsXc-hknP4tQDbSShdz8HArw,1308
464
468
  omlish/os/journald.py,sha256=2nI8Res1poXkbLc31--MPUlzYMESnCcPUkIxDOCjZW0,3903
@@ -482,7 +486,7 @@ omlish/secrets/subprocesses.py,sha256=ffjfbgPbEE_Pwb_87vG4yYR2CGZy3I31mHNCo_0JtH
482
486
  omlish/sockets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
483
487
  omlish/sockets/addresses.py,sha256=ZQFacDsXo6cKSgEjzN525IcUJPyfubXETzbY-_BBAro,1285
484
488
  omlish/sockets/handlers.py,sha256=9kkNMj1DTJa4xo_3hcBvSkjKc-dy_Ho5he2ubJieJ2A,621
485
- omlish/sockets/server.py,sha256=g9CSL0m6Ox10usyysXw4YRFr9H3LlQUH-9GftFCLeFw,1606
489
+ omlish/sockets/server.py,sha256=96vCNBvHSf8lWI3kd3RBbY0M2qXGaD_TksMhnBQ0_q0,1600
486
490
  omlish/specs/__init__.py,sha256=zZwF8yXTEkSstYtORkDhVLK-_hWU8WOJCuBpognb_NY,118
487
491
  omlish/specs/jmespath/LICENSE,sha256=IH-ZZlZkS8XMkf_ubNVD1aYHQ2l_wd0tmHtXrCcYpRU,1113
488
492
  omlish/specs/jmespath/__init__.py,sha256=9tsrquw1kXe1KAhTP3WeL0GlGBiTguQVxsC-lUYTWP4,2087
@@ -566,38 +570,46 @@ omlish/term/progressbar.py,sha256=TiwdmPSMa5jQj35i1NQURTWQGy4eWUNx_XiPM38JtvQ,31
566
570
  omlish/term/vt100/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
567
571
  omlish/term/vt100/c.py,sha256=cAhDKXI81PZRtFmTotfad3HZGREP1QnOlWYoAw6v-Fw,3532
568
572
  omlish/term/vt100/states.py,sha256=OxPUxfFTcfz56MhtDgIigEApChOtN6XO1g6R2H08mu4,8303
569
- omlish/term/vt100/terminal.py,sha256=sYLddUSrubCJPnI6f2t5Pzp0tFGLLBKyYdDfKmkwREM,9363
573
+ omlish/term/vt100/terminal.py,sha256=KUlg331ele7P6SHsBKdbpdQFDKsxSply1Ds27NkppTs,9359
570
574
  omlish/testing/__init__.py,sha256=M_BQrcCHkoL-ZvE-UpQ8XxXNYRRawhjUz4rCJnAqM2A,152
571
575
  omlish/testing/testing.py,sha256=TT2wwSzPZ_KhIvKxpM1qc1yHKD-LHDNgGrcr_h8vs7c,2895
572
- omlish/testing/pytest/__init__.py,sha256=B2nyJrjIoNcEopbg0IZ5UUDs4OHmQ8qqElFJfGcDdas,257
576
+ omlish/testing/pytest/__init__.py,sha256=rOpQYgp7jYjEIMjInzl-a_uIMqmOtVwGzDgJyCDpvxg,206
573
577
  omlish/testing/pytest/helpers.py,sha256=TJpD60mBtLi9FtxX4TThfuXvg5FIRPSiZk1aeRwe-D4,197
574
- omlish/testing/pytest/marks.py,sha256=4-3WgunN_fcmhkmQ6mtX_AFo5QRDwflNSH7NoyoXui4,432
575
578
  omlish/testing/pytest/skip.py,sha256=NxTkAQiS3HKZR3sfFdxOR2LCFwtCveY6Ap-qtexiZbw,839
576
579
  omlish/testing/pytest/inject/__init__.py,sha256=pdRKv1HcDmJ_yArKJbYITPXXZthRSGgBJWqITr0Er38,117
577
580
  omlish/testing/pytest/inject/harness.py,sha256=_Qf7lLcYc_dpauYOE68u_a65jPCFWmQUYv9m_OOdNqs,5724
578
581
  omlish/testing/pytest/plugins/__init__.py,sha256=ys1zXrYrNm7Uo6YOIVJ6Bd3dQo6kv387k7MbTYlqZSI,467
579
582
  omlish/testing/pytest/plugins/_registry.py,sha256=IK04KlBgiOJxKAyCCgjpX2R-9tE-btalYJkgjLc8Te8,77
580
- omlish/testing/pytest/plugins/asyncs.py,sha256=CG-cWWxCtxVIyKJKEjxfFV0MVwYBHPo1mb-umCGz9X8,5532
581
583
  omlish/testing/pytest/plugins/depskip.py,sha256=xithY-OMtjwhv8mcRNkv-WI_PSQtHldQ8H1s60MIXkk,2673
582
584
  omlish/testing/pytest/plugins/logging.py,sha256=Y1I_3DiiuDSynObkm8bNPZxdvljUWXbqD6YUM5uI34o,391
583
- omlish/testing/pytest/plugins/managermarks.py,sha256=AP3ty-QB-8O5DkulwUOudBlUOvXMHhBfNyY-0yCmejk,1520
585
+ omlish/testing/pytest/plugins/managermarks.py,sha256=IzkspjT8-ToPIlHZs9cHt6RYbm51poJLjYVvkFPbJhE,1300
584
586
  omlish/testing/pytest/plugins/pydevd.py,sha256=AXtN83M39ZKJ4VH3MJEhvPnAmYzD5u1r8ehz-0om50Q,842
585
587
  omlish/testing/pytest/plugins/repeat.py,sha256=flSQzE9GFOWksVKz-mUGnpxJpv3yRqn1G4K8pW7JHs0,498
586
588
  omlish/testing/pytest/plugins/skips.py,sha256=EoZDg1uWccgbAegmzqI85c7RliycD1e2J4Y7vfDRhwM,1041
587
589
  omlish/testing/pytest/plugins/spacing.py,sha256=JQQhi9q3c523Ro1a_K_9RGAb7HotiO74N8bYX2VESFE,707
588
590
  omlish/testing/pytest/plugins/switches.py,sha256=CflHe6gLhkLt_9OcAmzskuZsrhZhwOuL_bIdogibARc,3815
589
591
  omlish/testing/pytest/plugins/utils.py,sha256=L5C622UXcA_AUKDcvyh5IMiRfqSGGz0McdhwZWvfMlU,261
592
+ omlish/testing/pytest/plugins/asyncs/__init__.py,sha256=TTNhFmP_krug1973sq_bpWBTIvg68-1nbuVLSs92Z6k,41
593
+ omlish/testing/pytest/plugins/asyncs/consts.py,sha256=0NOCkzV43dOu3u97BqYMQ4mPG8JuFncpWibkOZpCqX4,55
594
+ omlish/testing/pytest/plugins/asyncs/fixtures.py,sha256=HyhtZLq5Qai7pS9Z4Ejl0f0NyVtDjJJL9fhbUKVUx2M,11299
595
+ omlish/testing/pytest/plugins/asyncs/plugin.py,sha256=-gVLHZb78nEfMOnmWKY0gdT3BOHjY3bp-GnBGshOvPo,6021
596
+ omlish/testing/pytest/plugins/asyncs/utils.py,sha256=K-nQxSJQL-3N_xtLqfCX11KSLYCG_gPQ6hZqLQZIHNQ,294
597
+ omlish/testing/pytest/plugins/asyncs/backends/__init__.py,sha256=DpJGt5KA2N2pNXy59raVyJH1969M1AP80pJAqIlNEAs,359
598
+ omlish/testing/pytest/plugins/asyncs/backends/asyncio.py,sha256=0b8pmbXNW2qI8qo1ARxpONdqw8DWf0v5J2-9mkM9hrc,820
599
+ omlish/testing/pytest/plugins/asyncs/backends/base.py,sha256=fTZ6R_iKpAp-8DVw8js8rxC_VNqj6onFD4KKBWnmtXk,587
600
+ omlish/testing/pytest/plugins/asyncs/backends/trio.py,sha256=xty9TR7-Kk6n0cdOqErLilPLLCchJe6zmEyhpypTmKM,3330
601
+ omlish/testing/pytest/plugins/asyncs/backends/trio_asyncio.py,sha256=VcGVwf4V-1ZFK_70FrFS9b11EU1dOy1ozhhIDXGNSEo,3169
590
602
  omlish/text/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
591
603
  omlish/text/asdl.py,sha256=AS3irh-sag5pqyH3beJif78PjCbOaFso1NeKq-HXuTs,16867
592
604
  omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
593
605
  omlish/text/glyphsplit.py,sha256=kqqjglRdxGo0czYZxOz9Vi8aBmVsCOq8h6lPwRA5xe0,3803
594
- omlish/text/indent.py,sha256=XixaVnk9bvtBlH0n_cwN6yS5IyfrTWpe_alfu3_saLY,1341
595
- omlish/text/minja.py,sha256=KAmZ2POcLcxwF4DPKxdWa16uWxXmVz1UnJXLSwt4oZo,5761
606
+ omlish/text/indent.py,sha256=YjtJEBYWuk8--b9JU_T6q4yxV85_TR7VEVr5ViRCFwk,1336
607
+ omlish/text/minja.py,sha256=jZC-fp3Xuhx48ppqsf2Sf1pHbC0t8XBB7UpUUoOk2Qw,5751
596
608
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
597
609
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
598
- omlish-0.0.0.dev195.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
599
- omlish-0.0.0.dev195.dist-info/METADATA,sha256=UtArTqsuJq-vNncfgBVBuYLEjkC8yCdMBKP3PIKpICs,4264
600
- omlish-0.0.0.dev195.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
601
- omlish-0.0.0.dev195.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
602
- omlish-0.0.0.dev195.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
603
- omlish-0.0.0.dev195.dist-info/RECORD,,
610
+ omlish-0.0.0.dev197.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
611
+ omlish-0.0.0.dev197.dist-info/METADATA,sha256=MjEjDgFhD7eg4RDWvX9ippECV4KjRVf8CoCIoRt2Wik,4264
612
+ omlish-0.0.0.dev197.dist-info/WHEEL,sha256=A3WOREP4zgxI0fKrHUG8DC8013e3dK3n7a6HDbcEIwE,91
613
+ omlish-0.0.0.dev197.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
614
+ omlish-0.0.0.dev197.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
615
+ omlish-0.0.0.dev197.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.6.0)
2
+ Generator: setuptools (75.7.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,56 +0,0 @@
1
- from .consts import ( # noqa
2
- DEFAULT_BUFFER_SIZE,
3
- )
4
-
5
- from .direct import ( # noqa
6
- DirectGenerator,
7
-
8
- BytesDirectGenerator,
9
- StrDirectGenerator,
10
- )
11
-
12
- from .readers import ( # noqa
13
- ReaderGenerator,
14
- BytesReaderGenerator,
15
- StrReaderGenerator,
16
-
17
- ExactReaderGenerator,
18
- BytesExactReaderGenerator,
19
- StrExactReaderGenerator,
20
-
21
- GeneratorReader,
22
-
23
- PrependableGeneratorReader,
24
- PrependableBytesGeneratorReader,
25
- PrependableStrGeneratorReader,
26
- prependable_bytes_generator_reader,
27
- prependable_str_generator_reader,
28
-
29
- BufferedGeneratorReader,
30
- BufferedBytesGeneratorReader,
31
- BufferedStrGeneratorReader,
32
- buffered_bytes_generator_reader,
33
- buffered_str_generator_reader,
34
- )
35
-
36
- from .stepped import ( # noqa
37
- SteppedGenerator,
38
- BytesSteppedGenerator,
39
- StrSteppedGenerator,
40
- BytesToStrSteppedGenerator,
41
- StrToBytesSteppedGenerator,
42
-
43
- SteppedReaderGenerator,
44
- BytesSteppedReaderGenerator,
45
- StrSteppedReaderGenerator,
46
-
47
- flatmap_stepped_generator,
48
-
49
- joined_bytes_stepped_generator,
50
- joined_str_stepped_generator,
51
-
52
- read_into_bytes_stepped_generator,
53
- read_into_str_stepped_generator,
54
-
55
- buffer_bytes_stepped_reader_generator,
56
- )
@@ -1,13 +0,0 @@
1
- import typing as ta
2
-
3
-
4
- O = ta.TypeVar('O')
5
- I = ta.TypeVar('I')
6
- R = ta.TypeVar('R')
7
-
8
-
9
- # Direct generators yield outputs 1:1 with inputs.
10
- DirectGenerator: ta.TypeAlias = ta.Generator[O, I, R]
11
-
12
- BytesDirectGenerator: ta.TypeAlias = DirectGenerator[bytes, bytes, R]
13
- StrDirectGenerator: ta.TypeAlias = DirectGenerator[str, str, R]
@@ -1,18 +0,0 @@
1
- import typing as ta
2
-
3
- import pytest
4
-
5
- from ... import lang # noqa
6
- from .plugins.managermarks import ManagerMark # noqa
7
-
8
-
9
- if ta.TYPE_CHECKING:
10
- from ...asyncs.asyncio import all as aiu
11
- else:
12
- aiu = lang.proxy_import('...asyncs.asyncio.all', __package__)
13
-
14
-
15
- class drain_asyncio(ManagerMark): # noqa
16
- def __call__(self, item: pytest.Function) -> ta.Iterator[None]:
17
- with aiu.draining_asyncio_tasks():
18
- yield