Changelog¶
[0.3.3] - 2026-04-12¶
Added¶
- High-level async files:
pyuring.open/async_openand classAsyncFile—async with pyuring.open(path, "rb") as f: await f.read()with binary modes only; io_uring path usesread_async/write_async+UringAsync; threaded fallback viabuiltins.open+run_in_executorwhenprefer_uring=Falseor ring creation fails afteros.open. UringErrorcontext: optionalfilename,offset, andlengthon errors; wired throughopenat, sync read/write, async read/write, and async file I/O.ResourceWarningifUringCtxorBufferPoolis finalized withoutclose()(skipped during interpreter shutdown).
Changed¶
AsyncFile: serialized I/O withasyncio.Lock; POSIX-styleread(n)(short reads / EOF loops); completionuser_datachecked against the submitted operation; mode validation against allowed binary spellings;Executor-typed optional executor.- Docs: opcode / setup-flag notes in
docs/SUPPORT.md.
Tests¶
tests/test_api_usability.py— async file roundtrip, fallback, partial reads, invalid mode, leak warning,UringErrorfields.
[0.3.2] - 2026-04-11¶
Added¶
- Ring presets:
UringCtx.with_sqpollandUringCtx.with_defer_taskrunfor commonIORING_SETUP_*combinations; modulepyuring.ring_presets(flag helpers and keyword dicts). BufferRing: contiguous slab +provide_buffersfor buffer groups;UringPool: fixed pool of independentUringCtxinstances.- Submit helpers (asyncio-friendly): C + Python —
multishot_accept_submit,recv_multishot_buffer_group_submit,splice_submit(submit without blocking; reap viawait_completion/UringAsync). - asyncio:
sendfile_splice(splice loop, e.g. file → pipe/socket) anditer_multishot_accept(async iterator over multishot accept completions). - Tests:
tests/test_todo_ring_features.py(presets, BufferRing, pool, splice/async cases; skips when the kernel rejects a setup flag or multishot accept).
[0.3.1] - 2026-04-10¶
Fixed¶
- Tests (CI / kernels with these opcodes): import
IORING_OP_FGETXATTR/IORING_OP_FSETXATTRwhere used;openat2+ftruncatecase opens the temp fileO_RDWR(read-only fds rejectftruncate);sockaddr_inpacking for io_uring socket tests uses native-endianAF_INET, network-order port, and correct padding sobind/connectroundtrips do not fail withEAFNOSUPPORT. - Manylinux wheel builds:
scripts/cibw_before_all.shrunsmake libraryin vendored liburing only. The defaultmaketarget also builds tests/examples and can fail in minimal cibuildwheel images; buildingsrc/alone matches what the extension links against.
Changed¶
- CI: removed the wheel-smoke job (one-off cp312 manylinux_x86_64 wheel + artifact on every push/PR).
lint, Ubuntumake+ unittest, and the Docker Debian/Fedora matrix are unchanged. Release (tagv*) still builds sdist + manylinux wheels and publishes to PyPI.
[0.3.0] - 2026-04-09¶
Added¶
UringAsync: asyncio integration viaring_fd+loop.add_reader(). File completions arrive as event-loop callbacks with no thread pool.wait_completion()andwait_completion_in_executor()APIs;UringAsync.close()deregisters the reader.UringErroris now a subclass ofOSError(errno,strerror,filenamefields populated). PEP 561 typing markers (py.typed,__init__.pyi) published in the wheel.UringCtxlifecycle safety:single_thread_check(defaultTrue) records the creating thread and raisesUringErroron cross-thread access. All entry points go through_ring()so use-after-close()raises a clear error.BufferPooluse-after-close()raisesUringError.- High-level helpers (
copy,write,write_many,copy_path,copy_path_dynamic,write_newfile,write_newfile_dynamic):sync_policyparameter ("none"/"data"/"end"),progress_cb(done_bytes, total_bytes) -> boolfor cooperative cancel and throttling. - Probe cache:
get_probe_info(),opcode_supported(),require_opcode_supported()inpyuring.capabilities; result cached per-process. - Examples (
examples/):asyncio/,fastapi/, andpytorch/each withbefore/andafter/showing the usual pattern vs pyuring;README.mddocuments how to run them. - Documentation fully rewritten in English under
docs/:USAGE.md(full API reference),INSTALLATION.md,BENCHMARKS.md,TESTING.md. read_async/write_async(non-*_ptr):UringCtxkeeps buffer objects until the matching completion is consumed; duplicateuser_datawhile an operation is in flight raisesValueError.- Packaging / CI: GitHub Actions —
CIworkflow (compileall, Ubuntu tests, Docker matrix Debian/Fedora, cibuildwheel smoke wheel);Releaseworkflow onv*tags builds sdist + manylinuxx86_64andaarch64wheels (QEMU for ARM on x86 runners) and publishes to PyPI.pyproject.toml:manylinux_2_28foraarch64/ PyPy aarch64.
Changed¶
pyproject.toml: skip*_i686and*-musllinux*wheel builds; usemanylinux_2_28images.setup.py: remove Python 3.6/3.7 classifiers (incompatible withpython_requires=">=3.8"); add 3.12,Operating System :: POSIX :: Linux.
[0.2.0] - 2026-04-08¶
PyPI release 0.2.0 (semver minor). Functionality and documentation are as summarized under [0.1.3] below; this tag is the recommended install target for pip install pyuring.
[0.1.3] - 2026-04-08¶
Added¶
- Documentation:
docs/SUPPORT.md(kernel/liburing matrix),docs/TESTING.md(CI policy, coverage goals, mandatory test list). Linked from README;MANIFEST.inincludesdocs/for sdist. - Regression tests:
tests/test_regression_cancel_timeout_peek.py(asyncio cancel onUringAsync.wait_completion, shorttimeout, emptypeek_completion,async_cancelerrno). Removed redundanttest_async_cancelin favor of the stricter case. io_uringqueue setup flags, fixed file/buffer registration, and opcode probe helpers onUringCtx, with tests.- Broader io_uring surface in the native wrapper; tests reorganized.
scripts/docker-test-matrix.shfor running the unittest suite across several Linux base images (Docker; requires relaxed seccomp for io_uring).- High-level
copy/write/write_many: optionalsync_policy(fsync /RWF_DSYNCpresets) andprogress_cb(done, total) -> boolfor cooperative cancel (ECANCELED) and throttling; C pipelines invoke progress after each completed write. copy_path_dynamic/write_newfile_dynamic: optionalprogress_cb(same semantics).pyuring.capabilities: process-cachedget_probe_info,opcode_supported,require_opcode_supported, plus doc URL constants; richerUringCtxconstructor error detail when queue init fails.
Changed¶
-
Documentation layout:
USAGE.md,INSTALLATION.md,CHANGELOG.md, andexamples/BENCHMARKS.md(asdocs/BENCHMARKS.md) now live underdocs/;README.mdstays at the repository root. Update bookmarks and PyPIproject_urlsaccordingly. -
Refactored bindings: implementation lives under
pyuring.native;pyuring._nativeremains a compatibility shim. UringCtx: optionalsingle_thread_check(defaultTrue) records the creating thread and rejects cross-thread calls withUringError; all native entry points go through_ring()so use afterclose()raises a clear error.BufferPool: use-after-close()raisesUringError. Documentation inUSAGE.md;wait_completion_in_executor/ tests usesingle_thread_check=Falsewhere the worker thread runswait_completion.
Fixed¶
- Release tooling:
publish-pypi.shdocumentsTWINE_USERNAME/TWINE_PASSWORDfor non-interactive PyPI uploads.
[0.1.2] - 2026-04-08¶
Changed¶
- README: formal API overview, tighter wording, trimmed extra Docker/benchmark tooling from the tree.
- README: Docker-based PyPI install verification and benchmark speedup chart.
Fixed¶
publish-pypi.sh: upload sdist only; PyPI rejects barelinux_x86_64wheels (see script header).
[0.1.1] - 2026-04-08¶
Added¶
scripts/publish-pypi.shfor building and uploading releases.- PyPI-oriented packaging metadata,
LICENSE, and thepyuring.direct/pyuring.rawgrouped namespace.
Fixed¶
- PyPI upload docs: avoid
twine upload dist/*when stray directories underdist/break Twine.
Changed¶
- Package rename to pyuring (from pyiouring); vendored liburing build path adjusted.
Notes¶
- First PyPI release under the pyuring name: ctypes bindings to
liburingwrap.so, high-levelcopy/write/write_manyhelpers, andUringCtxfor io_uring operations (Linux-only).