✨ feat(lock): add SQLite-based ReadWriteLock#399
Conversation
|
@gaborbernat I've pushed a more "serious" attempt. |
gaborbernat
left a comment
There was a problem hiding this comment.
Looks better, can you add tests please?
|
@gaborbernat what do you think about using SQLite's VFS interface directly, without the "dummy database" thing? https://github.com/rogerbinns/apsw provides bindings |
|
It's important that we have no dependencies. The only alternative could be
to hide this functionality behind some extra, I do not know how widely
available the bindings are in form of wheels.
…On Mon, Feb 24, 2025, 21:58 Roman Leventov ***@***.***> wrote:
@gaborbernat <https://github.com/gaborbernat> what do you think about
using SQLite's VFS interface <https://www.sqlite.org/vfs.html> directly,
without the "dummy database" thing? https://github.com/rogerbinns/apsw
provides bindings
—
Reply to this email directly, view it on GitHub
<#399 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AAFIQPULETXMCF2DNC5TAZD2RQA7HAVCNFSM6AAAAABXO35KTOVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDMOBQGY4TIOBZG4>
.
You are receiving this because you were mentioned.Message ID:
***@***.***>
[image: leventov]*leventov* left a comment (tox-dev/filelock#399)
<#399 (comment)>
@gaborbernat <https://github.com/gaborbernat> what do you think about
using SQLite's VFS interface <https://www.sqlite.org/vfs.html> directly,
without the "dummy database" thing? https://github.com/rogerbinns/apsw
provides bindings
—
Reply to this email directly, view it on GitHub
<#399 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AAFIQPULETXMCF2DNC5TAZD2RQA7HAVCNFSM6AAAAABXO35KTOVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDMOBQGY4TIOBZG4>
.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
|
@gaborbernat I've added tests. If you want to finesse API (context managers vs. parameters to acquire_read() and acquire_write() methods; are read_lock() and write_lock() methods even needed? Are instance's default timeout and blocking needed?), docs, formatting, class/method naming, etc., could you please do it yourself to your liking? |
|
@gaborbernat I don't need this PR to be merged to use it later through What of these seem valid to you, and what seem like false positives? Can the CI auto-fix from check / test pypy3.10 - windows-latest is test-suite related, perhaps even CI environment-related. |
|
Moved to draft until we fix the issues. |
for more information, see https://pre-commit.ci
for more information, see https://pre-commit.ci
44c36cc to
a5b6bbf
Compare
The existing test suite relied entirely on multiprocessing, which coverage cannot track across process boundaries. This left _read_write.py at 47% measured coverage despite the code being well-exercised. Added in-process unit tests covering all branches: timeout_for_sqlite, singleton metaclass, acquire/release, reentrance, mode conflicts, OperationalError handling, double-check race paths, and context managers. Parametrized read/write symmetric tests to reduce duplication. Fixed ruff violations (FBT, UP031, B904, ANN) and removed dead duplicate test helpers. Signed-off-by: Bernát Gábor <bgabor8@bloomberg.net>
The project had inconsistent docstrings (terse one-liners, malformed RST tags, typos) and the changelog stopped at v3.12.0 despite 20+ releases since. The new ReadWriteLock class also shipped without any docstrings or user-facing documentation. Expand class/method docstrings across _api.py, _soft.py, asyncio.py, and _read_write.py with RST-style :param:/:raises:/:return: tags and versionadded annotations. Fix ::return: -> :return: in asyncio properties and "in every case/" typo in release() docstrings. Rewrite docs/index.rst: replace "FileLock vs SoftFileLock" with "Choosing the right lock", add ReadWriteLock usage section, document asyncio support and singleton locks. Backfill changelog from v3.12.1 through v3.20.3. Signed-off-by: Bernát Gábor <bgabor8@bloomberg.net>
acquire_read and acquire_write had ~50 lines of duplicated structure (reentrant check, double-check after transaction lock, SQLite setup, error handling). Extract into _acquire, _validate_reentrant, and _configure_and_begin to eliminate the duplication. Also: rename con to _con (internal detail), fix absolute import to relative, widen AcquireReturnProxy type to accept ReadWriteLock, merge duplicate test helpers, improve chain_reader param naming, add comments to bare time.sleep calls, fix singleton cache fixture teardown, remove dead __main__ block, skip test_virtualenv on PyPy due to SQLite Cursor.__del__ segfault.
Single-letter process/thread variables (p1, p2, t, p, e) made tests harder to scan. Renamed to role-based names: reader, writer, holder, contender, successor, crashing, worker, thread, etc.
Docstring lines were wrapping at ~80 chars leaving significant unused space. Reflowed all multi-line docstrings to fill closer to the 120-char limit, reducing total line count. Also removed trailing backslash continuations in favor of natural line breaks.
The `ty` type checker flagged four errors: `cls.get_lock` was unresolvable inside the metaclass `__call__`, the 2-arg `super()` call was invalid for metaclass contexts, and `Timeout()` received `PathLike` instead of `str`. Moved singleton resolution logic into the metaclass `__call__` directly (matching the `FileLockMeta` pattern in `_api.py`), making `get_lock` a thin wrapper. Added `os.fspath()` conversion in `__init__` so `lock_file` is always `str` downstream.
The tag-triggered release pipeline required creating a tag manually before releasing, with no changelog generation or GitHub release notes. Switched to a `workflow_dispatch` pipeline (modeled after toml-fmt) where maintainers choose the semver bump level from the Actions UI. The workflow computes the next version, auto-generates changelog from git history and PR metadata, builds the package with the correct version tag for hatch-vcs, publishes to PyPI, and creates a GitHub release with generated notes. Removed the handwritten v3.21.0 unreleased changelog entry since it will be auto-generated at release time. Signed-off-by: Bernát Gábor <bgabor8@bloomberg.net>
PyPy's GC collects ReadWriteLock objects during fixture teardown, triggering Cursor.__del__._reset on already-finalized SQLite state. Explicitly close connections in the test fixture before clearing the singleton cache so GC has nothing dangerous to finalize. Guard __del__ with contextlib.suppress for defense in depth. Signed-off-by: Bernát Gábor <bgabor8@bloomberg.net>
PyPy's GC can run sqlite3.Cursor.__del__._reset at any allocation point after a connection is closed, causing a segfault. This happens because __del__ on ReadWriteLock would call rollback() (creating cursors) then close(), leaving orphan cursors for later GC to trip over. Replace __del__ with an atexit handler that closes all connections before interpreter finalization. Add an explicit close() method for deterministic cleanup.
This PR contains the following updates: | Package | Type | Update | Change | Pending | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---|---|---|---| | [astral-sh/ruff-pre-commit](https://redirect.github.com/astral-sh/ruff-pre-commit) | repository | patch | `v0.15.0` → `v0.15.1` | |  |  | | [astral-sh/uv-pre-commit](https://redirect.github.com/astral-sh/uv-pre-commit) | repository | patch | `0.10.0` → `0.10.2` | |  |  | | [biomejs/pre-commit](https://redirect.github.com/biomejs/pre-commit) | repository | patch | `v2.3.14` → `v2.3.15` | |  |  | | [coverage](https://redirect.github.com/coveragepy/coveragepy) | dependency-groups | patch | `7.13.3` → `7.13.4` | |  |  | | [filelock](https://redirect.github.com/tox-dev/py-filelock) | dependency-groups | minor | `3.20.3` → `3.21.2` | `3.24.1` (+3) |  |  | | [ruff](https://docs.astral.sh/ruff) ([source](https://redirect.github.com/astral-sh/ruff), [changelog](https://redirect.github.com/astral-sh/ruff/blob/main/CHANGELOG.md)) | dependency-groups | patch | `0.15.0` → `0.15.1` | |  |  | | [tombi-toml/tombi-pre-commit](https://redirect.github.com/tombi-toml/tombi-pre-commit) | repository | patch | `v0.7.27` → `v0.7.28` | |  |  | | [tox](https://redirect.github.com/tox-dev/tox) ([changelog](https://tox.wiki/en/latest/changelog.html)) | dependency-groups | minor | `4.34.1` → `4.35.0` | `4.36.0` |  |  | Note: The `pre-commit` manager in Renovate is not supported by the `pre-commit` maintainers or community. Please do not report any problems there, instead [create a Discussion in the Renovate repository](https://redirect.github.com/renovatebot/renovate/discussions/new) if you have any questions. --- ### Release Notes <details> <summary>astral-sh/ruff-pre-commit (astral-sh/ruff-pre-commit)</summary> ### [`v0.15.1`](https://redirect.github.com/astral-sh/ruff-pre-commit/releases/tag/v0.15.1) [Compare Source](https://redirect.github.com/astral-sh/ruff-pre-commit/compare/v0.15.0...v0.15.1) See: <https://github.com/astral-sh/ruff/releases/tag/0.15.1> </details> <details> <summary>astral-sh/uv-pre-commit (astral-sh/uv-pre-commit)</summary> ### [`v0.10.2`](https://redirect.github.com/astral-sh/uv-pre-commit/releases/tag/0.10.2) [Compare Source](https://redirect.github.com/astral-sh/uv-pre-commit/compare/0.10.1...0.10.2) See: <https://github.com/astral-sh/uv/releases/tag/0.10.2> ### [`v0.10.1`](https://redirect.github.com/astral-sh/uv-pre-commit/releases/tag/0.10.1) [Compare Source](https://redirect.github.com/astral-sh/uv-pre-commit/compare/0.10.0...0.10.1) See: <https://github.com/astral-sh/uv/releases/tag/0.10.1> </details> <details> <summary>biomejs/pre-commit (biomejs/pre-commit)</summary> ### [`v2.3.15`](https://redirect.github.com/biomejs/pre-commit/compare/v2.3.14...v2.3.15) [Compare Source](https://redirect.github.com/biomejs/pre-commit/compare/v2.3.14...v2.3.15) </details> <details> <summary>coveragepy/coveragepy (coverage)</summary> ### [`v7.13.4`](https://redirect.github.com/coveragepy/coveragepy/blob/HEAD/CHANGES.rst#Version-7134--2026-02-09) [Compare Source](https://redirect.github.com/coveragepy/coveragepy/compare/7.13.3...7.13.4) - Fix: the third-party code fix in 7.13.3 required examining the parent directories where coverage was run. In the unusual situation that one of the parent directories is unreadable, a PermissionError would occur, as described in `issue 2129`\_. This is now fixed. - Fix: in test suites that change sys.path, coverage.py could fail with "RuntimeError: Set changed size during iteration" as described and fixed in `pull 2130`\_. Thanks, Noah Fatsi. - We now publish ppc64le wheels, thanks to `Pankhudi Jain <pull 2121_>`\_. .. \_pull 2121: [#​2121](https://redirect.github.com/coveragepy/coveragepy/pull/2121) .. \_issue 2129: [#​2129](https://redirect.github.com/coveragepy/coveragepy/issues/2129) .. \_pull 2130: [#​2130](https://redirect.github.com/coveragepy/coveragepy/pull/2130) .. \_changes\_7-13-3: </details> <details> <summary>tox-dev/py-filelock (filelock)</summary> ### [`v3.21.2`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.21.2) [Compare Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.21.1...3.21.2) <!-- Release notes generated using configuration in .github/release.yml at 3.21.2 --> #### What's Changed - 🐛 fix: catch ImportError for missing sqlite3 C library by [@​gaborbernat](https://redirect.github.com/gaborbernat) in [tox-dev/filelock#475](https://redirect.github.com/tox-dev/filelock/pull/475) **Full Changelog**: <tox-dev/filelock@3.21.1...3.21.2> ### [`v3.21.1`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.21.1) [Compare Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.21.0...3.21.1) <!-- Release notes generated using configuration in .github/release.yml at 3.21.1 --> #### What's Changed - 🐛 fix: gracefully handle missing `sqlite3` when importing `ReadWriteLock` by [@​bayandin](https://redirect.github.com/bayandin) in [tox-dev/filelock#473](https://redirect.github.com/tox-dev/filelock/pull/473) #### New Contributors - [@​bayandin](https://redirect.github.com/bayandin) made their first contribution in [tox-dev/filelock#473](https://redirect.github.com/tox-dev/filelock/pull/473) **Full Changelog**: <tox-dev/filelock@3.21.0...3.21.1> ### [`v3.21.0`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.21.0) <!-- Release notes generated using configuration in .github/release.yml at 3.21.0 --> #### What's Changed - 🔧 chore: modernize tooling and bump deps by [@​gaborbernat](https://redirect.github.com/gaborbernat) in [tox-dev/filelock#470](https://redirect.github.com/tox-dev/filelock/pull/470) - ✨ feat(lock): add SQLite-based ReadWriteLock by [@​leventov](https://redirect.github.com/leventov) in [tox-dev/filelock#399](https://redirect.github.com/tox-dev/filelock/pull/399) - Enable removal of UNIX lock files by [@​sbc100](https://redirect.github.com/sbc100) in [tox-dev/filelock#408](https://redirect.github.com/tox-dev/filelock/pull/408) - 👷 ci(release): persist changelog on release by [@​gaborbernat](https://redirect.github.com/gaborbernat) in [tox-dev/filelock#471](https://redirect.github.com/tox-dev/filelock/pull/471) - 👷 ci(release): commit changelog and use release config by [@​gaborbernat](https://redirect.github.com/gaborbernat) in [tox-dev/filelock#472](https://redirect.github.com/tox-dev/filelock/pull/472) #### New Contributors - [@​leventov](https://redirect.github.com/leventov) made their first contribution in [tox-dev/filelock#399](https://redirect.github.com/tox-dev/filelock/pull/399) - [@​sbc100](https://redirect.github.com/sbc100) made their first contribution in [tox-dev/filelock#408](https://redirect.github.com/tox-dev/filelock/pull/408) **Full Changelog**: <tox-dev/filelock@3.20.3...3.21.0> </details> <details> <summary>astral-sh/ruff (ruff)</summary> ### [`v0.15.1`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0151) [Compare Source](https://redirect.github.com/astral-sh/ruff/compare/0.15.0...0.15.1) Released on 2026-02-12. ##### Preview features - \[`airflow`] Add ruff rules to catch deprecated Airflow imports for Airflow 3.1 (`AIR321`) ([#​22376](https://redirect.github.com/astral-sh/ruff/pull/22376)) - \[`airflow`] Third positional parameter not named `ti_key` should be flagged for `BaseOperatorLink.get_link` (`AIR303`) ([#​22828](https://redirect.github.com/astral-sh/ruff/pull/22828)) - \[`flake8-gettext`] Fix false negatives for plural argument of `ngettext` (`INT001`, `INT002`, `INT003`) ([#​21078](https://redirect.github.com/astral-sh/ruff/pull/21078)) - \[`pyflakes`] Fix infinite loop in preview fix for `unused-import` (`F401`) ([#​23038](https://redirect.github.com/astral-sh/ruff/pull/23038)) - \[`pygrep-hooks`] Detect non-existent mock methods in standalone expressions (`PGH005`) ([#​22830](https://redirect.github.com/astral-sh/ruff/pull/22830)) - \[`pylint`] Allow dunder submodules and improve diagnostic range (`PLC2701`) ([#​22804](https://redirect.github.com/astral-sh/ruff/pull/22804)) - \[`pyupgrade`] Improve diagnostic range for tuples (`UP024`) ([#​23013](https://redirect.github.com/astral-sh/ruff/pull/23013)) - \[`refurb`] Check subscripts in tuple do not use lambda parameters in `reimplemented-operator` (`FURB118`) ([#​23079](https://redirect.github.com/astral-sh/ruff/pull/23079)) - \[`ruff`] Detect mutable defaults in `field` calls (`RUF008`) ([#​23046](https://redirect.github.com/astral-sh/ruff/pull/23046)) - \[`ruff`] Ignore std `cmath.inf` (`RUF069`) ([#​23120](https://redirect.github.com/astral-sh/ruff/pull/23120)) - \[`ruff`] New rule `float-equality-comparison` (`RUF069`) ([#​20585](https://redirect.github.com/astral-sh/ruff/pull/20585)) - Don't format unlabeled Markdown code blocks ([#​23106](https://redirect.github.com/astral-sh/ruff/pull/23106)) - Markdown formatting support in LSP ([#​23063](https://redirect.github.com/astral-sh/ruff/pull/23063)) - Support Quarto Markdown language markers ([#​22947](https://redirect.github.com/astral-sh/ruff/pull/22947)) - Support formatting `pycon` Markdown code blocks ([#​23112](https://redirect.github.com/astral-sh/ruff/pull/23112)) - Use extension mapping to select Markdown code block language ([#​22934](https://redirect.github.com/astral-sh/ruff/pull/22934)) ##### Bug fixes - Avoid false positive for undefined variables in `FAST001` ([#​23224](https://redirect.github.com/astral-sh/ruff/pull/23224)) - Avoid introducing syntax errors for `FAST003` autofix ([#​23227](https://redirect.github.com/astral-sh/ruff/pull/23227)) - Avoid suggesting `InitVar` for `__post_init__` that references PEP 695 type parameters ([#​23226](https://redirect.github.com/astral-sh/ruff/pull/23226)) - Deduplicate type variables in generic functions ([#​23225](https://redirect.github.com/astral-sh/ruff/pull/23225)) - Fix exception handler parenthesis removal for Python 3.14+ ([#​23126](https://redirect.github.com/astral-sh/ruff/pull/23126)) - Fix f-string middle panic when parsing t-strings ([#​23232](https://redirect.github.com/astral-sh/ruff/pull/23232)) - Wrap `RUF020` target for multiline fixes ([#​23210](https://redirect.github.com/astral-sh/ruff/pull/23210)) - Wrap `UP007` target for multiline fixes ([#​23208](https://redirect.github.com/astral-sh/ruff/pull/23208)) - Fix missing diagnostics for last range suppression in file ([#​23242](https://redirect.github.com/astral-sh/ruff/pull/23242)) - \[`pyupgrade`] Fix syntax error on string with newline escape and comment (`UP037`) ([#​22968](https://redirect.github.com/astral-sh/ruff/pull/22968)) ##### Rule changes - Use `ruff` instead of `Ruff` as the program name in GitHub output format ([#​23240](https://redirect.github.com/astral-sh/ruff/pull/23240)) - \[`PT006`] Fix syntax error when unpacking nested tuples in `parametrize` fixes ([#​22441](https://redirect.github.com/astral-sh/ruff/issues/22441)) ([#​22464](https://redirect.github.com/astral-sh/ruff/pull/22464)) - \[`airflow`] Catch deprecated attribute access from context key for Airflow 3.0 (`AIR301`) ([#​22850](https://redirect.github.com/astral-sh/ruff/pull/22850)) - \[`airflow`] Capture deprecated arguments and a decorator (`AIR301`) ([#​23170](https://redirect.github.com/astral-sh/ruff/pull/23170)) - \[`flake8-boolean-trap`] Add `multiprocessing.Value` to excluded functions for `FBT003` ([#​23010](https://redirect.github.com/astral-sh/ruff/pull/23010)) - \[`flake8-bugbear`] Add a secondary annotation showing the previous occurrence (`B033`) ([#​22634](https://redirect.github.com/astral-sh/ruff/pull/22634)) - \[`flake8-type-checking`] Add sub-diagnostic showing the runtime use of an annotation (`TC004`) ([#​23091](https://redirect.github.com/astral-sh/ruff/pull/23091)) - \[`isort`] Support configurable import section heading comments ([#​23151](https://redirect.github.com/astral-sh/ruff/pull/23151)) - \[`ruff`] Improve the diagnostic for `RUF012` ([#​23202](https://redirect.github.com/astral-sh/ruff/pull/23202)) ##### Formatter - Suppress diagnostic output for `format --check --silent` ([#​17736](https://redirect.github.com/astral-sh/ruff/pull/17736)) ##### Documentation - Add tabbed shell completion documentation ([#​23169](https://redirect.github.com/astral-sh/ruff/pull/23169)) - Explain how to enable Markdown formatting for pre-commit hook ([#​23077](https://redirect.github.com/astral-sh/ruff/pull/23077)) - Fixed import in `runtime-evaluated-decorators` example ([#​23187](https://redirect.github.com/astral-sh/ruff/pull/23187)) - Update ruff server contributing guide ([#​23060](https://redirect.github.com/astral-sh/ruff/pull/23060)) ##### Other changes - Exclude WASM artifacts from GitHub releases ([#​23221](https://redirect.github.com/astral-sh/ruff/pull/23221)) ##### Contributors - [@​mkniewallner](https://redirect.github.com/mkniewallner) - [@​bxff](https://redirect.github.com/bxff) - [@​dylwil3](https://redirect.github.com/dylwil3) - [@​Avasam](https://redirect.github.com/Avasam) - [@​amyreese](https://redirect.github.com/amyreese) - [@​charliermarsh](https://redirect.github.com/charliermarsh) - [@​Alex-ley-scrub](https://redirect.github.com/Alex-ley-scrub) - [@​Kalmaegi](https://redirect.github.com/Kalmaegi) - [@​danparizher](https://redirect.github.com/danparizher) - [@​AiyionPrime](https://redirect.github.com/AiyionPrime) - [@​eureka928](https://redirect.github.com/eureka928) - [@​11happy](https://redirect.github.com/11happy) - [@​Jkhall81](https://redirect.github.com/Jkhall81) - [@​chirizxc](https://redirect.github.com/chirizxc) - [@​leandrobbraga](https://redirect.github.com/leandrobbraga) - [@​tvatter](https://redirect.github.com/tvatter) - [@​anishgirianish](https://redirect.github.com/anishgirianish) - [@​shaanmajid](https://redirect.github.com/shaanmajid) - [@​ntBre](https://redirect.github.com/ntBre) - [@​sjyangkevin](https://redirect.github.com/sjyangkevin) </details> <details> <summary>tombi-toml/tombi-pre-commit (tombi-toml/tombi-pre-commit)</summary> ### [`v0.7.28`](https://redirect.github.com/tombi-toml/tombi-pre-commit/releases/tag/v0.7.28) [Compare Source](https://redirect.github.com/tombi-toml/tombi-pre-commit/compare/v0.7.27...v0.7.28) See: <https://github.com/tombi-toml/tombi/releases/tag/v0.7.28> </details> <details> <summary>tox-dev/tox (tox)</summary> ### [`v4.35.0`](https://redirect.github.com/tox-dev/tox/releases/tag/4.35.0) [Compare Source](https://redirect.github.com/tox-dev/tox/compare/4.34.1...4.35.0) <!-- Release notes generated using configuration in .github/release.yml at 4.35.0 --> #### What's Changed - docs: fix misleading ENVDIR reference in devenv description by [@​VedantMadane](https://redirect.github.com/VedantMadane) in [#​3670](https://redirect.github.com/tox-dev/tox/pull/3670) - Fix CI post packaging releese by [@​gaborbernat](https://redirect.github.com/gaborbernat) in [#​3673](https://redirect.github.com/tox-dev/tox/pull/3673) - Fix code block format in docs/plugins.rst by [@​mushitoriami](https://redirect.github.com/mushitoriami) in [#​3675](https://redirect.github.com/tox-dev/tox/pull/3675) - fix(docs): correct path for built documentation by [@​daniel7an](https://redirect.github.com/daniel7an) in [#​3680](https://redirect.github.com/tox-dev/tox/pull/3680) - Document injected environment variables by [@​rahuldevikar](https://redirect.github.com/rahuldevikar) in [#​3681](https://redirect.github.com/tox-dev/tox/pull/3681) - Show toxfile.py inline plugin in --version output by [@​rahuldevikar](https://redirect.github.com/rahuldevikar) in [#​3682](https://redirect.github.com/tox-dev/tox/pull/3682) #### New Contributors - [@​VedantMadane](https://redirect.github.com/VedantMadane) made their first contribution in [#​3670](https://redirect.github.com/tox-dev/tox/pull/3670) - [@​mushitoriami](https://redirect.github.com/mushitoriami) made their first contribution in [#​3675](https://redirect.github.com/tox-dev/tox/pull/3675) - [@​daniel7an](https://redirect.github.com/daniel7an) made their first contribution in [#​3680](https://redirect.github.com/tox-dev/tox/pull/3680) - [@​rahuldevikar](https://redirect.github.com/rahuldevikar) made their first contribution in [#​3681](https://redirect.github.com/tox-dev/tox/pull/3681) **Full Changelog**: <tox-dev/tox@4.34.1...4.35.0> </details> --- ### Configuration 📅 **Schedule**: Branch creation - "before 4am on monday" in timezone UTC, Automerge - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) in timezone UTC. 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://redirect.github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/ansible/molecule). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My44LjUiLCJ1cGRhdGVkSW5WZXIiOiI0My44LjUiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImNob3JlIiwiZGVwZW5kZW5jaWVzIl19--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
> ℹ️ **Note**
>
> This PR body was truncated due to platform limits.
This PR contains the following updates:
| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [MarkupSafe](https://redirect.github.com/pallets/markupsafe)
([changelog](https://markupsafe.palletsprojects.com/page/changes/)) |
`~=2.0.1` → `~=2.1.5` |

|

|
| [PyJWT](https://redirect.github.com/jpadilla/pyjwt) | `~=2.9.0` →
`~=2.11.0` |

|

|
| [alembic](https://redirect.github.com/sqlalchemy/alembic)
([changelog](https://alembic.sqlalchemy.org/en/latest/changelog.html)) |
`~=1.16.5` → `~=1.18.4` |

|

|
| [celery](https://docs.celeryq.dev/)
([source](https://redirect.github.com/celery/celery),
[changelog](https://docs.celeryq.dev/en/stable/changelog.html)) |
`~=5.5.0` → `~=5.6.2` |

|

|
| [celery-types](https://redirect.github.com/sbdchd/celery-types) |
`~=0.23.0` → `~=0.24.0` |

|

|
| [checksumdir](https://redirect.github.com/cakepietoast/checksumdir) |
`~=1.2.0` → `~=1.3.0` |

|

|
| [fastapi](https://redirect.github.com/fastapi/fastapi)
([changelog](https://fastapi.tiangolo.com/release-notes/)) | `==0.130.0`
→ `==0.133.0` |

|

|
| [filelock](https://redirect.github.com/tox-dev/py-filelock) |
`~=3.20.3` → `~=3.24.3` |

|

|
| [httpx](https://redirect.github.com/encode/httpx)
([changelog](https://redirect.github.com/encode/httpx/blob/master/CHANGELOG.md))
| `~=0.27.0` → `~=0.28.1` |

|

|
| [humanize](https://redirect.github.com/python-humanize/humanize)
([changelog](https://redirect.github.com/python-humanize/humanize/releases))
| `~=4.11.0` → `~=4.15.0` |

|

|
| [mypy](https://redirect.github.com/python/mypy)
([changelog](https://mypy.readthedocs.io/en/latest/changelog.html)) |
`~=1.15.0` → `~=1.19.1` |

|

|
| [numexpr](https://redirect.github.com/pydata/numexpr) | `==2.13.1` →
`==2.14.1` |

|

|
| [numpy](https://redirect.github.com/numpy/numpy)
([changelog](https://numpy.org/doc/stable/release)) | `~=2.3.5` →
`~=2.4.2` |

|

|
| [plyer](https://plyer.readthedocs.org/en/latest/) | `~=2.0.0` →
`~=2.1.0` |

|

|
| [pre-commit](https://redirect.github.com/pre-commit/pre-commit) |
`~=4.1.0` → `~=4.5.1` |

|

|
|
[prometheus-client](https://redirect.github.com/prometheus/client_python)
| `==0.23.1` → `==0.24.1` |

|

|
| [py7zr](https://redirect.github.com/miurahr/py7zr)
([changelog](https://py7zr.readthedocs.io/en/latest/Changelog.html)) |
`~=0.20.6` → `~=0.22.0` |

|

|
| [pyinstaller](https://redirect.github.com/pyinstaller/pyinstaller)
([changelog](https://pyinstaller.org/en/stable/CHANGES.html)) |
`==6.17.0` → `==6.19.0` |

|

|
|
[pyinstaller-hooks-contrib](https://redirect.github.com/pyinstaller/pyinstaller-hooks-contrib)
| `==2025.10` → `==2026.0` |

|

|
| [redis](https://redirect.github.com/redis/redis-py)
([changelog](https://redirect.github.com/redis/redis-py/releases)) |
`~=5.2.0` → `~=5.3.1` |

|

|
| [ruff](https://docs.astral.sh/ruff)
([source](https://redirect.github.com/astral-sh/ruff),
[changelog](https://redirect.github.com/astral-sh/ruff/blob/main/CHANGELOG.md))
| `~=0.9.6` → `~=0.15.2` |

|

|
| [types-redis](https://redirect.github.com/python/typeshed)
([changelog](https://redirect.github.com/typeshed-internal/stub_uploader/blob/main/data/changelogs/redis.md))
| `~=4.1.2` → `~=4.6.0` |

|

|
| [types-requests](https://redirect.github.com/python/typeshed)
([changelog](https://redirect.github.com/typeshed-internal/stub_uploader/blob/main/data/changelogs/requests.md))
| `~=2.27.1` → `~=2.32.4` |

|

|
| [uvicorn](https://redirect.github.com/Kludex/uvicorn)
([changelog](https://uvicorn.dev/release-notes)) | `~=0.37.0` →
`~=0.41.0` |

|

|
---
### Release Notes
<details>
<summary>pallets/markupsafe (MarkupSafe)</summary>
###
[`v2.1.5`](https://redirect.github.com/pallets/markupsafe/blob/HEAD/CHANGES.rst#Version-215)
[Compare
Source](https://redirect.github.com/pallets/markupsafe/compare/2.1.4...2.1.5)
Released 2024-02-02
- Fix `striptags` not collapsing spaces. :issue:`417`
###
[`v2.1.4`](https://redirect.github.com/pallets/markupsafe/blob/HEAD/CHANGES.rst#Version-214)
[Compare
Source](https://redirect.github.com/pallets/markupsafe/compare/2.1.3...2.1.4)
Released 2024-01-19
- Don't use regular expressions for `striptags`, avoiding a performance
issue. :pr:`413`
###
[`v2.1.3`](https://redirect.github.com/pallets/markupsafe/blob/HEAD/CHANGES.rst#Version-213)
[Compare
Source](https://redirect.github.com/pallets/markupsafe/compare/2.1.2...2.1.3)
Released 2023-06-02
- Implement `format_map`, `casefold`, `removeprefix`, and `removesuffix`
methods. :issue:`370`
- Fix static typing for basic `str` methods on `Markup`. :issue:`358`
- Use `Self` for annotating return types. :pr:`379`
###
[`v2.1.2`](https://redirect.github.com/pallets/markupsafe/blob/HEAD/CHANGES.rst#Version-212)
[Compare
Source](https://redirect.github.com/pallets/markupsafe/compare/2.1.1...2.1.2)
Released 2023-01-17
- Fix `striptags` not stripping tags containing newlines.
:issue:`310`
###
[`v2.1.1`](https://redirect.github.com/pallets/markupsafe/blob/HEAD/CHANGES.rst#Version-211)
[Compare
Source](https://redirect.github.com/pallets/markupsafe/compare/2.1.0...2.1.1)
Released 2022-03-14
- Avoid ambiguous regex matches in `striptags`. :pr:`293`
###
[`v2.1.0`](https://redirect.github.com/pallets/markupsafe/blob/HEAD/CHANGES.rst#Version-210)
[Compare
Source](https://redirect.github.com/pallets/markupsafe/compare/2.0.1...2.1.0)
Released 2022-02-17
- Drop support for Python 3.6. :pr:`262`
- Remove `soft_unicode`, which was previously deprecated. Use
`soft_str` instead. :pr:`261`
- Raise error on missing single placeholder during string
interpolation. :issue:`225`
- Disable speedups module for GraalPython. :issue:`277`
</details>
<details>
<summary>jpadilla/pyjwt (PyJWT)</summary>
###
[`v2.11.0`](https://redirect.github.com/jpadilla/pyjwt/blob/HEAD/CHANGELOG.rst#Unreleased-httpsgithubcomjpadillapyjwtcompare2110HEAD)
[Compare
Source](https://redirect.github.com/jpadilla/pyjwt/compare/2.10.1...2.11.0)
Fixed
```
Added
```
###
[`v2.10.1`](https://redirect.github.com/jpadilla/pyjwt/blob/HEAD/CHANGELOG.rst#Unreleased-httpsgithubcomjpadillapyjwtcompare2101HEAD)
[Compare
Source](https://redirect.github.com/jpadilla/pyjwt/compare/2.10.0...2.10.1)
Fixed
```
- Validate key against allowed types for Algorithm family in `#​964 <https://github.com/jpadilla/pyjwt/pull/964>`__
- Add iterator for JWKSet in `#​1041 <https://github.com/jpadilla/pyjwt/pull/1041>`__
- Validate `iss` claim is a string during encoding and decoding by @​pachewise in `#​1040 <https://github.com/jpadilla/pyjwt/pull/1040>`__
- Improve typing/logic for `options` in decode, decode_complete by @​pachewise in `#​1045 <https://github.com/jpadilla/pyjwt/pull/1045>`__
- Declare float supported type for lifespan and timeout by @​nikitagashkov in `#​1068 <https://github.com/jpadilla/pyjwt/pull/1068>`__
Added
```
- Docs: Add example of using leeway with nbf by
[@​djw8605](https://redirect.github.com/djw8605) in `#​1034
<https://github.com/jpadilla/pyjwt/pull/1034>`\_\_
- Docs: Refactored docs with `autodoc`; added `PyJWS` and
`jwt.algorithms` docs by
[@​pachewise](https://redirect.github.com/pachewise) in
`#​1045 <https://github.com/jpadilla/pyjwt/pull/1045>`\_\_
- Docs: Documentation improvements for "sub" and "jti" claims by
[@​cleder](https://redirect.github.com/cleder) in `#​1088
<https://github.com/jpadilla/pyjwt/pull/1088>`
###
[`v2.10.0`](https://redirect.github.com/jpadilla/pyjwt/blob/HEAD/CHANGELOG.rst#v2101-httpsgithubcomjpadillapyjwtcompare21002101)
[Compare
Source](https://redirect.github.com/jpadilla/pyjwt/compare/2.9.0...2.10.0)
Fixed
```
- Prevent partial matching of `iss` claim by @​fabianbadoi in `GHSA-75c5-xw7c-p5pm <https://github.com/jpadilla/pyjwt/security/advisories/GHSA-75c5-xw7c-p5pm>`__
```
</details>
<details>
<summary>celery/celery (celery)</summary>
###
[`v5.6.2`](https://redirect.github.com/celery/celery/blob/HEAD/Changelog.rst#562)
[Compare
Source](https://redirect.github.com/celery/celery/compare/v5.6.1...v5.6.2)
\=====
:release-date: 2026-01-04
:release-by: Tomer Nosrati
What's Changed
```
- Fix recursive WorkController instantiation in DjangoWorkerFixup + AttributeError when pool_cls is a string (#​10045)
- Bugfix: Revoked tasks now immediately update backend status to REVOKED (#​9869)
- Prepare for release: v5.6.2 (#​10049)
.. _version-5.6.1:
5.6.1
=====
:release-date: 2025-12-29
:release-by: Tomer Nosrati
What's Changed
```
- Fix Redis Sentinel ACL authentication support
([#​10013](https://redirect.github.com/celery/celery/issues/10013))
- Fix: Broker heartbeats not sent during graceful shutdown
([#​9986](https://redirect.github.com/celery/celery/issues/9986))
- docs
[#​5410](https://redirect.github.com/celery/celery/issues/5410) --
Document confirm\_publish broker transport option
([#​10016](https://redirect.github.com/celery/celery/issues/10016))
- close DB pools only in prefork mode
([#​10020](https://redirect.github.com/celery/celery/issues/10020))
- Fix: Avoid unnecessary Django database connection creation during
cleanup
([#​10015](https://redirect.github.com/celery/celery/issues/10015))
- reliable prefork detection
([#​10023](https://redirect.github.com/celery/celery/issues/10023))
- better coverage
([#​10029](https://redirect.github.com/celery/celery/issues/10029))
- Docs: clarify `result_extended` vs periodic task metadata and show
`headers["periodic_task_name"]` example
([#​10030](https://redirect.github.com/celery/celery/issues/10030))
- Stop importing pytest\_subtests
([#​10032](https://redirect.github.com/celery/celery/issues/10032))
- Only use exceptiongroup backport for Python < 3.11
([#​10033](https://redirect.github.com/celery/celery/issues/10033))
- Prepare for release: v5.6.1
([#​10037](https://redirect.github.com/celery/celery/issues/10037))
.. \_version-5.6.0:
###
[`v5.6.1`](https://redirect.github.com/celery/celery/blob/HEAD/Changelog.rst#561)
[Compare
Source](https://redirect.github.com/celery/celery/compare/v5.6.0...v5.6.1)
\=====
:release-date: 2025-12-29
:release-by: Tomer Nosrati
What's Changed
```
- Fix Redis Sentinel ACL authentication support (#​10013)
- Fix: Broker heartbeats not sent during graceful shutdown (#​9986)
- docs #​5410 -- Document confirm_publish broker transport option (#​10016)
- close DB pools only in prefork mode (#​10020)
- Fix: Avoid unnecessary Django database connection creation during cleanup (#​10015)
- reliable prefork detection (#​10023)
- better coverage (#​10029)
- Docs: clarify `result_extended` vs periodic task metadata and show `headers["periodic_task_name"]` example (#​10030)
- Stop importing pytest_subtests (#​10032)
- Only use exceptiongroup backport for Python < 3.11 (#​10033)
- Prepare for release: v5.6.1 (#​10037)
.. _version-5.6.0:
5.6.0
=====
:release-date: 2025-11-30
:release-by: Tomer Nosrati
Celery v5.6.0 is now available.
Key Highlights
```
See :ref:`whatsnew-5.6` for a complete overview or read the main
highlights below.
## Python 3.9 Minimum Version
Celery 5.6.0 drops support for Python 3.8 (EOL). The minimum required
Python
version is now 3.9. Users still on Python 3.8 must upgrade their Python
version
before upgrading to Celery 5.6.0.
Additionally, this release includes initial support for Python 3.14.
## SQS: Reverted to `pycurl` from `urllib3`
The switch from `pycurl` to `urllib3` for the SQS transport (introduced
in
Celery 5.5.0 via Kombu) has been reverted due to critical issues
affecting SQS
users:
- Processing throughput dropped from \~100 tasks/sec to \~3/sec in some
environments
- `UnknownOperationException` errors causing container crash loops
- Silent message processing failures with no error logs
Users of the SQS transport must ensure `pycurl` is installed. If you
removed
`pycurl` after upgrading to Celery 5.5.0, you will need to reinstall it.
Contributed by `@auvipy <https://github.com/auvipy>`\_ in
`#​9620 <https://github.com/celery/celery/pull/9620>`\_.
## Security Fix: Broker Credential Leak Prevention
Fixed a security issue where broker URLs containing passwords were being
logged
in plaintext by the delayed delivery mechanism. Broker credentials are
now
properly sanitized in all log output.
Contributed by `@giancarloromeo <https://github.com/giancarloromeo>`\_
in
`#​9997 <https://github.com/celery/celery/pull/9997>`\_.
## Memory Leak Fixes
Two significant memory leaks have been fixed in this release:
**Exception Handling Memory Leak**: Fixed a critical memory leak in task
exception
handling that was particularly severe on Python 3.11+ due to enhanced
traceback
data. The fix properly breaks reference cycles in tracebacks to allow
garbage
collection.
Contributed by `@jaiganeshs21 <https://github.com/jaiganeshs21>`\_ in
`#​9799 <https://github.com/celery/celery/pull/9799>`\_.
**Pending Result Memory Leak**: Fixed a memory leak where `AsyncResult`
subscriptions were not being cleaned up when results were forgotten.
Contributed by `@tsoos99dev <https://github.com/tsoos99dev>`\_ in
`#​9806 <https://github.com/celery/celery/pull/9806>`\_.
## ETA Task Memory Limit
New configuration option :setting:`worker_eta_task_limit` to prevent
out-of-memory
crashes when workers fetch large numbers of ETA or countdown tasks.
Previously,
workers could exhaust available memory when the broker contained many
scheduled tasks.
Example usage:
.. code-block:: python
```
app.conf.worker_eta_task_limit = 1000
```
Contributed by `@sashu2310 <https://github.com/sashu2310>`\_ in
`#​9853 <https://github.com/celery/celery/pull/9853>`\_.
## Queue Type Selection for Auto-created Queues
New configuration options allow specifying the queue type and exchange
type when
Celery auto-creates missing queues. This is particularly useful for
RabbitMQ users
who want to use quorum queues with auto-created queues.
Configuration options:
- :setting:`task_create_missing_queue_type`: Sets the queue type for
auto-created
queues (e.g., `quorum`, `classic`)
- :setting:`task_create_missing_queue_exchange_type`: Sets the exchange
type for
auto-created queues
Example usage:
.. code-block:: python
```
app.conf.task_create_missing_queue_type = 'quorum'
```
Contributed by `@ghirailghiro <https://github.com/ghirailghiro>`\_ in
`#​9815 <https://github.com/celery/celery/pull/9815>`\_.
What's Changed
```
- Prepare for release: v5.6.0 (#​10010)
.. _version-5.6.0rc2:
5.6.0rc2
========
:release-date: 2025-11-22
:release-by: Tomer Nosrati
Celery v5.6.0 Release Candidate 2 is now available for testing.
Please help us test this version and report any issues.
What's Changed
```
- Remove Python 4.0 version condition for pytest dependencies
([#​9993](https://redirect.github.com/celery/celery/issues/9993))
- Sanitize broker URL in delayed delivery logs (avoid leaking
credentials)
([#​9997](https://redirect.github.com/celery/celery/issues/9997))
- Don't fail task on timeout during cold shutdown
([#​9678](https://redirect.github.com/celery/celery/issues/9678))
- Add Py39-314t to CI
([#​9999](https://redirect.github.com/celery/celery/issues/9999))
- asynpool: Don't return from inside a finally block
([#​10000](https://redirect.github.com/celery/celery/issues/10000))
- Prepare for (pre) release: v5.6.0rc2
([#​10005](https://redirect.github.com/celery/celery/issues/10005))
.. \_version-5.6.0rc1:
###
[`v5.6.0`](https://redirect.github.com/celery/celery/blob/HEAD/Changelog.rst#560)
[Compare
Source](https://redirect.github.com/celery/celery/compare/v5.5.3...v5.6.0)
\=====
:release-date: 2025-11-30
:release-by: Tomer Nosrati
Celery v5.6.0 is now available.
Key Highlights
```
See :ref:`whatsnew-5.6` for a complete overview or read the main highlights below.
Python 3.9 Minimum Version
--------------------------
Celery 5.6.0 drops support for Python 3.8 (EOL). The minimum required Python
version is now 3.9. Users still on Python 3.8 must upgrade their Python version
before upgrading to Celery 5.6.0.
Additionally, this release includes initial support for Python 3.14.
SQS: Reverted to ``pycurl`` from ``urllib3``
--------------------------------------------
The switch from ``pycurl`` to ``urllib3`` for the SQS transport (introduced in
Celery 5.5.0 via Kombu) has been reverted due to critical issues affecting SQS
users:
- Processing throughput dropped from ~100 tasks/sec to ~3/sec in some environments
- ``UnknownOperationException`` errors causing container crash loops
- Silent message processing failures with no error logs
Users of the SQS transport must ensure ``pycurl`` is installed. If you removed
``pycurl`` after upgrading to Celery 5.5.0, you will need to reinstall it.
Contributed by `@auvipy <https://github.com/auvipy>`_ in
`#​9620 <https://github.com/celery/celery/pull/9620>`_.
Security Fix: Broker Credential Leak Prevention
------------------------------------------------
Fixed a security issue where broker URLs containing passwords were being logged
in plaintext by the delayed delivery mechanism. Broker credentials are now
properly sanitized in all log output.
Contributed by `@giancarloromeo <https://github.com/giancarloromeo>`_ in
`#​9997 <https://github.com/celery/celery/pull/9997>`_.
Memory Leak Fixes
-----------------
Two significant memory leaks have been fixed in this release:
**Exception Handling Memory Leak**: Fixed a critical memory leak in task exception
handling that was particularly severe on Python 3.11+ due to enhanced traceback
data. The fix properly breaks reference cycles in tracebacks to allow garbage
collection.
Contributed by `@jaiganeshs21 <https://github.com/jaiganeshs21>`_ in
`#​9799 <https://github.com/celery/celery/pull/9799>`_.
**Pending Result Memory Leak**: Fixed a memory leak where ``AsyncResult``
subscriptions were not being cleaned up when results were forgotten.
Contributed by `@tsoos99dev <https://github.com/tsoos99dev>`_ in
`#​9806 <https://github.com/celery/celery/pull/9806>`_.
ETA Task Memory Limit
---------------------
New configuration option :setting:`worker_eta_task_limit` to prevent out-of-memory
crashes when workers fetch large numbers of ETA or countdown tasks. Previously,
workers could exhaust available memory when the broker contained many scheduled tasks.
Example usage:
.. code-block:: python
app.conf.worker_eta_task_limit = 1000
Contributed by `@sashu2310 <https://github.com/sashu2310>`_ in
`#​9853 <https://github.com/celery/celery/pull/9853>`_.
Queue Type Selection for Auto-created Queues
--------------------------------------------
New configuration options allow specifying the queue type and exchange type when
Celery auto-creates missing queues. This is particularly useful for RabbitMQ users
who want to use quorum queues with auto-created queues.
Configuration options:
- :setting:`task_create_missing_queue_type`: Sets the queue type for auto-created
queues (e.g., ``quorum``, ``classic``)
- :setting:`task_create_missing_queue_exchange_type`: Sets the exchange type for
auto-created queues
Example usage:
.. code-block:: python
app.conf.task_create_missing_queue_type = 'quorum'
Contributed by `@ghirailghiro <https://github.com/ghirailghiro>`_ in
`#​9815 <https://github.com/celery/celery/pull/9815>`_.
What's Changed
```
- Prepare for release: v5.6.0
([#​10010](https://redirect.github.com/celery/celery/issues/10010))
.. \_version-5.6.0rc2:
</details>
<details>
<summary>cakepietoast/checksumdir (checksumdir)</summary>
###
[`v1.3.0`](https://redirect.github.com/to-mc/checksumdir/releases/tag/1.3.0)
[Compare
Source](https://redirect.github.com/cakepietoast/checksumdir/compare/1.2.0...1.3.0)
Python compatibility
</details>
<details>
<summary>fastapi/fastapi (fastapi)</summary>
###
[`v0.133.0`](https://redirect.github.com/fastapi/fastapi/compare/0.132.1...0.133.0)
[Compare
Source](https://redirect.github.com/fastapi/fastapi/compare/0.132.1...0.133.0)
###
[`v0.132.1`](https://redirect.github.com/fastapi/fastapi/releases/tag/0.132.1)
[Compare
Source](https://redirect.github.com/fastapi/fastapi/compare/0.132.0...0.132.1)
##### Refactors
- ♻️ Refactor logic to handle OpenAPI and Swagger UI escaping data. PR
[#​14986](https://redirect.github.com/fastapi/fastapi/pull/14986)
by [@​tiangolo](https://redirect.github.com/tiangolo).
##### Internal
- 👥 Update FastAPI People - Experts. PR
[#​14972](https://redirect.github.com/fastapi/fastapi/pull/14972)
by [@​tiangolo](https://redirect.github.com/tiangolo).
- 👷 Allow skipping `benchmark` job in `test` workflow. PR
[#​14974](https://redirect.github.com/fastapi/fastapi/pull/14974)
by [@​YuriiMotov](https://redirect.github.com/YuriiMotov).
###
[`v0.132.0`](https://redirect.github.com/fastapi/fastapi/releases/tag/0.132.0)
[Compare
Source](https://redirect.github.com/fastapi/fastapi/compare/0.131.0...0.132.0)
##### Breaking Changes
- 🔒️ Add `strict_content_type` checking for JSON requests. PR
[#​14978](https://redirect.github.com/fastapi/fastapi/pull/14978)
by [@​tiangolo](https://redirect.github.com/tiangolo).
- Now FastAPI checks, by default, that JSON requests have a
`Content-Type` header with a valid JSON value, like `application/json`,
and rejects requests that don't.
- If the clients for your app don't send a valid `Content-Type` header
you can disable this with `strict_content_type=False`.
- Check the new docs: [Strict Content-Type
Checking](https://fastapi.tiangolo.com/advanced/strict-content-type/).
##### Internal
- ⬆ Bump flask from 3.1.2 to 3.1.3. PR
[#​14949](https://redirect.github.com/fastapi/fastapi/pull/14949)
by
[@​dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Update all dependencies to use `griffelib` instead of `griffe`. PR
[#​14973](https://redirect.github.com/fastapi/fastapi/pull/14973)
by [@​svlandeg](https://redirect.github.com/svlandeg).
- 🔨 Fix `FastAPI People` workflow. PR
[#​14951](https://redirect.github.com/fastapi/fastapi/pull/14951)
by [@​YuriiMotov](https://redirect.github.com/YuriiMotov).
- 👷 Do not run codspeed with coverage as it's not tracked. PR
[#​14966](https://redirect.github.com/fastapi/fastapi/pull/14966)
by [@​tiangolo](https://redirect.github.com/tiangolo).
- 👷 Do not include benchmark tests in coverage to speed up coverage
processing. PR
[#​14965](https://redirect.github.com/fastapi/fastapi/pull/14965)
by [@​tiangolo](https://redirect.github.com/tiangolo).
###
[`v0.131.0`](https://redirect.github.com/fastapi/fastapi/releases/tag/0.131.0)
[Compare
Source](https://redirect.github.com/fastapi/fastapi/compare/0.130.0...0.131.0)
##### Breaking Changes
- 🗑️ Deprecate `ORJSONResponse` and `UJSONResponse`. PR
[#​14964](https://redirect.github.com/fastapi/fastapi/pull/14964)
by [@​tiangolo](https://redirect.github.com/tiangolo).
</details>
<details>
<summary>tox-dev/py-filelock (filelock)</summary>
###
[`v3.24.3`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.24.3)
[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.24.2...3.24.3)
<!-- Release notes generated using configuration in .github/release.yml
at 3.24.3 -->
#### What's Changed
- 🐛 fix(ci): add trailing blank line after changelog entries by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#492](https://redirect.github.com/tox-dev/filelock/pull/492)
- 🐛 fix(unix): handle ENOENT race on FUSE/NFS during acquire by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#495](https://redirect.github.com/tox-dev/filelock/pull/495)
**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.24.2...3.24.3>
###
[`v3.24.2`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.24.2)
[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.24.1...3.24.2)
<!-- Release notes generated using configuration in .github/release.yml
at 3.24.2 -->
#### What's Changed
- 📝 docs: restructure using Diataxis framework by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#489](https://redirect.github.com/tox-dev/filelock/pull/489)
- 🐛 fix(test): resolve flaky write non-starvation test by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#490](https://redirect.github.com/tox-dev/filelock/pull/490)
- 🐛 fix(rw): close sqlite3 cursors and skip SoftFileLock Windows race by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#491](https://redirect.github.com/tox-dev/filelock/pull/491)
**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.24.1...3.24.2>
###
[`v3.24.1`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.24.1)
[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.24.0...3.24.1)
<!-- Release notes generated using configuration in .github/release.yml
at 3.24.1 -->
#### What's Changed
- 🐛 fix(soft): resolve Windows deadlock and test race condition by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#488](https://redirect.github.com/tox-dev/filelock/pull/488)
**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.24.0...3.24.1>
###
[`v3.24.0`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.24.0)
[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.23.0...3.24.0)
<!-- Release notes generated using configuration in .github/release.yml
at 3.24.0 -->
#### What's Changed
- 🐛 fix(unix): auto-fallback to SoftFileLock on ENOSYS by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#480](https://redirect.github.com/tox-dev/filelock/pull/480)
- ✨ feat(lock): add poll\_interval to constructor by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#482](https://redirect.github.com/tox-dev/filelock/pull/482)
- 🐛 fix(win): eliminate lock file race in threaded usage by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#484](https://redirect.github.com/tox-dev/filelock/pull/484)
- ✨ feat(mode): respect POSIX default ACL inheritance by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#483](https://redirect.github.com/tox-dev/filelock/pull/483)
- 🐛 fix(api): detect same-thread self-deadlock by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#481](https://redirect.github.com/tox-dev/filelock/pull/481)
- ✨ feat(lock): add cancel\_check to acquire by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#487](https://redirect.github.com/tox-dev/filelock/pull/487)
- ✨ feat(lock): add lifetime parameter for lock expiration by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#486](https://redirect.github.com/tox-dev/filelock/pull/486)
**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.23.0...3.24.0>
###
[`v3.23.0`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.23.0)
[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.22.0...3.23.0)
<!-- Release notes generated using configuration in .github/release.yml
at 3.23.0 -->
#### What's Changed
- 📝 docs: add fasteners to similar libraries by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#478](https://redirect.github.com/tox-dev/filelock/pull/478)
- 📝 docs: move from Unlicense to MIT by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#479](https://redirect.github.com/tox-dev/filelock/pull/479)
**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.22.0...3.23.0>
###
[`v3.22.0`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.22.0)
[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.21.2...3.22.0)
<!-- Release notes generated using configuration in .github/release.yml
at 3.22.0 -->
#### What's Changed
- ✨ feat(soft): detect and break stale locks by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#476](https://redirect.github.com/tox-dev/filelock/pull/476)
- 🐛 fix(soft): skip stale lock detection on Windows by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#477](https://redirect.github.com/tox-dev/filelock/pull/477)
**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.21.2...3.22.0>
###
[`v3.21.2`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.21.2)
[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.21.1...3.21.2)
<!-- Release notes generated using configuration in .github/release.yml
at 3.21.2 -->
#### What's Changed
- 🐛 fix: catch ImportError for missing sqlite3 C library by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#475](https://redirect.github.com/tox-dev/filelock/pull/475)
**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.21.1...3.21.2>
###
[`v3.21.1`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.21.1)
[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.21.0...3.21.1)
<!-- Release notes generated using configuration in .github/release.yml
at 3.21.1 -->
#### What's Changed
- 🐛 fix: gracefully handle missing `sqlite3` when importing
`ReadWriteLock` by
[@​bayandin](https://redirect.github.com/bayandin) in
[tox-dev/filelock#473](https://redirect.github.com/tox-dev/filelock/pull/473)
#### New Contributors
- [@​bayandin](https://redirect.github.com/bayandin) made their
first contribution in
[tox-dev/filelock#473](https://redirect.github.com/tox-dev/filelock/pull/473)
**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.21.0...3.21.1>
###
[`v3.21.0`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.21.0)
<!-- Release notes generated using configuration in .github/release.yml
at 3.21.0 -->
#### What's Changed
- 🔧 chore: modernize tooling and bump deps by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#470](https://redirect.github.com/tox-dev/filelock/pull/470)
- ✨ feat(lock): add SQLite-based ReadWriteLock by
[@​leventov](https://redirect.github.com/leventov) in
[tox-dev/filelock#399](https://redirect.github.com/tox-dev/filelock/pull/399)
- Enable removal of UNIX lock files by
[@​sbc100](https://redirect.github.com/sbc100) in
[tox-dev/filelock#408](https://redirect.github.com/tox-dev/filelock/pull/408)
- 👷 ci(release): persist changelog on release by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#471](https://redirect.github.com/tox-dev/filelock/pull/471)
- 👷 ci(release): commit changelog and use release config by
[@​gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#472](https://redirect.github.com/tox-dev/filelock/pull/472)
#### New Contributors
- [@​leventov](https://redirect.github.com/leventov) made their
first contribution in
[tox-dev/filelock#399](https://redirect.github.com/tox-dev/filelock/pull/399)
- [@​sbc100](https://redirect.github.com/sbc100) made their first
contribution in
[tox-dev/filelock#408](https://redirect.github.com/tox-dev/filelock/pull/408)
**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.20.3...3.21.0>
</details>
<details>
<summary>encode/httpx (httpx)</summary>
###
[`v0.28.1`](https://redirect.github.com/encode/httpx/blob/HEAD/CHANGELOG.md#0281-6th-December-2024)
[Compare
Source](https://redirect.github.com/encode/httpx/compare/0.28.0...0.28.1)
- Fix SSL case where `verify=False` together with client side
certificates.
###
[`v0.28.0`](https://redirect.github.com/encode/httpx/blob/HEAD/CHANGELOG.md#0280-28th-November-2024)
[Compare
Source](https://redirect.github.com/encode/httpx/compare/0.27.2...0.28.0)
Be aware that the default *JSON request bodies now use a more compact
representation*. This is generally considered a prefered style, tho may
require updates to test suites.
The 0.28 release includes a limited set of deprecations...
**Deprecations**:
We are working towards a simplified SSL configuration API.
*For users of the standard `verify=True` or `verify=False` cases, or
`verify=<ssl_context>` case this should require no changes. The
following cases have been deprecated...*
- The `verify` argument as a string argument is now deprecated and will
raise warnings.
- The `cert` argument is now deprecated and will raise warnings.
Our revised [SSL documentation](docs/advanced/ssl.md) covers how to
implement the same behaviour with a more constrained API.
**The following changes are also included**:
- The deprecated `proxies` argument has now been removed.
- The deprecated `app` argument has now been removed.
- JSON request bodies use a compact representation.
([#​3363](https://redirect.github.com/encode/httpx/issues/3363))
- Review URL percent escape sets, based on WHATWG spec.
([#​3371](https://redirect.github.com/encode/httpx/issues/3371),
[#​3373](https://redirect.github.com/encode/httpx/issues/3373))
- Ensure `certifi` and `httpcore` are only imported if required.
([#​3377](https://redirect.github.com/encode/httpx/issues/3377))
- Treat `socks5h` as a valid proxy scheme.
([#​3178](https://redirect.github.com/encode/httpx/issues/3178))
- Cleanup `Request()` method signature in line with `client.request()`
and `httpx.request()`.
([#​3378](https://redirect.github.com/encode/httpx/issues/3378))
- Bugfix: When passing `params={}`, always strictly update rather than
merge with an existing querystring.
([#​3364](https://redirect.github.com/encode/httpx/issues/3364))
</details>
<details>
<summary>python-humanize/humanize (humanize)</summary>
###
[`v4.15.0`](https://redirect.github.com/python-humanize/humanize/releases/tag/4.15.0)
[Compare
Source](https://redirect.github.com/python-humanize/humanize/compare/4.14.0...4.15.0)
#### Added
- Add locale support for decimal separator in `intword`
([#​287](https://redirect.github.com/python-humanize/humanize/issues/287))
[@​hugovk](https://redirect.github.com/hugovk)
- Add support for Python 3.15
([#​275](https://redirect.github.com/python-humanize/humanize/issues/275))
[@​hugovk](https://redirect.github.com/hugovk)
#### Changed
- Replace pre-commit with prek
([#​276](https://redirect.github.com/python-humanize/humanize/issues/276))
[@​hugovk](https://redirect.github.com/hugovk)
#### Fixed
- `naturaldelta`: round the value to nearest unit that makes sense
([#​272](https://redirect.github.com/python-humanize/humanize/issues/272))
[@​dangillet](https://redirect.github.com/dangillet)
- Fix plural form for `intword` and improve performance
([#​273](https://redirect.github.com/python-humanize/humanize/issues/273))
[@​dangillet](https://redirect.github.com/dangillet)
- Replace `Exception` with more specific `FileNotFoundError`
([#​286](https://redirect.github.com/python-humanize/humanize/issues/286))
[@​hugovk](https://redirect.github.com/hugovk)
###
[`v4.14.0`](https://redirect.github.com/python-humanize/humanize/releases/tag/4.14.0)
[Compare
Source](https://redirect.github.com/python-humanize/humanize/compare/4.13.0...4.14.0)
#### Added
- Add Uzbek language
([#​264](https://redirect.github.com/python-humanize/humanize/issues/264))
[@​sSimuSs](https://redirect.github.com/sSimuSs)
#### Changed
- Drop support for Python 3.9
([#​268](https://redirect.github.com/python-humanize/humanize/issues/268))
[@​hugovk](https://redirect.github.com/hugovk)
###
[`v4.13.0`](https://redirect.github.com/python-humanize/humanize/releases/tag/4.13.0)
[Compare
Source](https://redirect.github.com/python-humanize/humanize/compare/4.12.3...4.13.0)
#### Changed
- Optimise `naturalsize` algorithm by using `math.log`
([#​253](https://redirect.github.com/python-humanize/humanize/issues/253))
[@​Zaczero](https://redirect.github.com/Zaczero)
#### Fixed
- Fix `precisedelta` rounding
([#​254](https://redirect.github.com/python-humanize/humanize/issues/254))
[@​dangillet](https://redirect.github.com/dangillet)
###
[`v4.12.3`](https://redirect.github.com/python-humanize/humanize/releases/tag/4.12.3)
[Compare
Source](https://redirect.github.com/python-humanize/humanize/compare/4.12.2...4.12.3)
#### Fixed
- Fix regression in `naturalsize` for `float` and `str`
([#​250](https://redirect.github.com/python-humanize/humanize/issues/250))
[@​loicleyendecker](https://redirect.github.com/loicleyendecker)
- Improvements for French translation
([#​248](https://redirect.github.com/python-humanize/humanize/issues/248))
[@​merwok](https://redirect.github.com/merwok)
###
[`v4.12.2`](https://redirect.github.com/python-humanize/humanize/releases/tag/4.12.2)
[Compare
Source](https://redirect.github.com/python-humanize/humanize/compare/4.12.1...4.12.2)
#### Fixed
- Update license file reference from `LICENSE` to `LICENCE` in
`pyproject.toml`
([#​243](https://redirect.github.com/python-humanize/humanize/issues/243))
[@​williamjamir](https://redirect.github.com/williamjamir)
- Update docstring in naturaldelta
([#​242](https://redirect.github.com/python-humanize/humanize/issues/242))
[@​teobucci](https://redirect.github.com/teobucci)
- Ignore `sys.monitoring` warning for Python 3.11 and earlier in
coverage.py config
([#​244](https://redirect.github.com/python-humanize/humanize/issues/244))
[@​hugovk](https://redirect.github.com/hugovk)
###
[`v4.12.1`](https://redirect.github.com/python-humanize/humanize/releases/tag/4.12.1)
[Compare
Source](https://redirect.github.com/python-humanize/humanize/compare/4.12.0...4.12.1)
#### Fixed
- Fix regression in `naturalsize` for float
([#​240](https://redirect.github.com/python-humanize/humanize/issues/240))
[@​hugovk](https://redirect.github.com/hugovk)
###
[`v4.12.0`](https://redirect.github.com/python-humanize/humanize/releases/tag/4.12.0)
[Compare
Source](https://redirect.github.com/python-humanize/humanize/compare/4.11.0...4.12.0)
#### Added
- Add support for Python 3.14 and test PyPy3.11
([#​235](https://redirect.github.com/python-humanize/humanize/issues/235))
[@​hugovk](https://redirect.github.com/hugovk)
- Handle en\_GB and en\_US locale
([#​230](https://redirect.github.com/python-humanize/humanize/issues/230))
[@​dangillet](https://redirect.github.com/dangillet)
- Release to PyPI using Trusted Publishing
([#​213](https://redirect.github.com/python-humanize/humanize/issues/213))
[@​hugovk](https://redirect.github.com/hugovk)
#### Changed
- Defer imports for faster overall import time: 19 ms -> 3 ms
([#​234](https://redirect.github.com/python-humanize/humanize/issues/234),
[#​238](https://redirect.github.com/python-humanize/humanize/issues/238))
[@​hugovk](https://redirect.github.com/hugovk)
- Replace deprecated classifier with licence expression (PEP 639)
([#​236](https://redirect.github.com/python-humanize/humanize/issues/236))
[@​hugovk](https://redirect.github.com/hugovk)
- Lint and test with tox-uv
([#​212](https://redirect.github.com/python-humanize/humanize/issues/212))
[@​hugovk](https://redirect.github.com/hugovk)
#### Fixed
- Fix overflow issue in `naturalsize` with `np.int32` input
([#​218](https://redirect.github.com/python-humanize/humanize/issues/218))
[@​Toprak2](https://redirect.github.com/Toprak2)
- Fix pt\_BR locale
([#​216](https://redirect.github.com/python-humanize/humanize/issues/216))
[@​cuducos](https://redirect.github.com/cuducos)
- Generate translation binaries during release
([#​232](https://redirect.github.com/python-humanize/humanize/issues/232))
[@​hugovk](https://redirect.github.com/hugovk)
</details>
<details>
<summary>python/mypy (mypy)</summary>
###
[`v1.19.1`](https://redirect.github.com/python/mypy/blob/HEAD/CHANGELOG.md#Mypy-1191)
[Compare
Source](https://redirect.github.com/python/mypy/compare/v1.19.0...v1.19.1)
- Fix noncommutative joins with bounded TypeVars (Shantanu, PR
[20345](https://redirect.github.com/python/mypy/pull/20345))
- Respect output format for cached runs by serializing raw errors in
cache metas (Ivan Levkivskyi, PR
[20372](https://redirect.github.com/python/mypy/pull/20372))
- Allow `types.NoneType` in match cases (A5rocks, PR
[20383](https://redirect.github.com/python/mypy/pull/20383))
- Fix mypyc generator regression with empty tuple (BobTheBuidler, PR
[20371](https://redirect.github.com/python/mypy/pull/20371))
- Fix crash involving Unpack-ed TypeVarTuple (Shantanu, PR
[20323](https://redirect.github.com/python/mypy/pull/20323))
- Fix crash on star import of redefinition (Ivan Levkivskyi, PR
[20333](https://redirect.github.com/python/mypy/pull/20333))
- Fix crash on typevar with forward ref used in other module (Ivan
Levkivskyi, PR
[20334](https://redirect.github.com/python/mypy/pull/20334))
- Fail with an explicit error on PyPy (Ivan Levkivskyi, PR
[20389](https://redirect.github.com/python/mypy/pull/20389))
###
[`v1.19.0`](https://redirect.github.com/python/mypy/compare/v1.18.2...v1.19.0)
[Compare
Source](https://redirect.github.com/python/mypy/compare/v1.18.2...v1.19.0)
###
[`v1.18.2`](https://redirect.github.com/python/mypy/blob/HEAD/CHANGELOG.md#Mypy-1182)
[Compare
Source](https://redirect.github.com/python/mypy/compare/v1.18.1...v1.18.2)
- Fix crash on recursive alias (Ivan Levkivskyi, PR
[19845](https://redirect.github.com/python/mypy/pull/19845))
- Add additional guidance for stubtest errors when runtime is
`object.__init__` (Stephen Morton, PR
[19733](https://redirect.github.com/python/mypy/pull/19733))
- Fix handling of None values in f-string expressions in mypyc
(BobTheBuidler, PR
[19846](https://redirect.github.com/python/mypy/pull/19846))
###
[`v1.18.1`](https://redirect.github.com/python/mypy/compare/v1.17.1...v1.18.1)
[Compare
Source](https://redirect.github.com/python/mypy/compare/v1.17.1...v1.18.1)
###
[`v1.17.1`](https://redirect.github.com/python/mypy/blob/HEAD/CHANGELOG.md#Mypy-1171)
[Compare
Source](https://redirect.github.com/python/mypy/compare/v1.17.0...v1.17.1)
- Retain `None` as constraints bottom if no bottoms were provided
(Stanislav Terliakov, PR
[19485](https://redirect.github.com/python/mypy/pull/19485))
- Fix "ignored exception in `hasattr`" in dmypy (Stanislav Terliakov, PR
[19428](https://redirect.github.com/python/mypy/pull/19428))
- Prevent a crash when InitVar is redefined with a method in a subclass
(Stanislav Terliakov, PR
[19453](https://redirect.github.com/python/mypy/pull/19453))
###
[`v1.17.0`](https://redirect.github.com/python/mypy/compare/v1.16.1...v1.17.0)
[Compare
Source](https://redirect.github.com/python/mypy/compare/v1.16.1...v1.17.0)
###
[`v1.16.1`](https://redirect.github.com/python/mypy/compare/v1.16.0...v1.16.1)
[Compare
Source](https://redirect.github.com/python/mypy/compare/v1.16.0...v1.16.1)
###
[`v1.16.0`](https://redirect.github.com/python/mypy/compare/v1.15.0...v1.16.0)
[Compare
Source](https://redirect.github.com/python/mypy/compare/v1.15.0...v1.16.0)
</details>
<details>
<summary>pydata/numexpr (numexpr)</summary>
###
[`v2.14.1`](https://redirect.github.com/pydata/numexpr/blob/HEAD/RELEASE_NOTES.rst#Changes-from-2141-to-2142)
[Compare
Source](https://redirect.github.com/pydata/numexpr/compare/v2.14.0...v2.14.1)
- **Under development.**
###
[`v2.14.0`](https://redirect.github.com/pydata/numexpr/blob/HEAD/RELEASE_NOTES.rst#Changes-from-2140-to-2141)
[Compare
Source](https://redirect.github.com/pydata/numexpr/compare/v2.13.1...v2.14.0)
- Rolled back static typing support to ensure compatibiity with NumPy
1.26.
- Added CI tests for NumPy 1.26
</details>
<details>
<summary>numpy/numpy (numpy)</summary>
###
[`v2.4.2`](https://redirect.github.com/numpy/numpy/compare/v2.4.1...v2.4.2)
[Compare
Source](https://redirect.github.com/numpy/numpy/compare/v2.4.1...v2.4.2)
###
[`v2.4.1`](https://redirect.github.com/numpy/numpy/releases/tag/v2.4.1):
2.4.1 (Jan 10, 2026)
[Compare
Source](https://redirect.github.com/numpy/numpy/compare/v2.4.0...v2.4.1)
##### NumPy 2.4.1 Release Notes
The NumPy 2.4.1 is a patch release that fixes bugs discoved after the
2.4.0 release. In particular, the typo `SeedlessSequence` is preserved
to
enable wheels using the random Cython API and built against NumPy <
2.4.0
to run without errors.
This release supports Python versions 3.11-3.14
##### Contributors
A total of 9 people contributed to this release. People with a "+" by
their
names contributed a patch for the first time.
- Alexander Shadchin
- Bill Tompkins +
- Charles Harris
- Joren Hammudoglu
- Marten van Kerkwijk
- Nathan Goldbaum
- Raghuveer Devulapalli
- Ralf Gommers
- Sebastian Berg
##### Pull requests merged
A total of 15 pull requests were merged for this release.
- [#​30490](https://redirect.github.com/numpy/numpy/pull/30490):
MAINT: Prepare 2.4.x for further development
- [#​30503](https://redirect.github.com/numpy/numpy/pull/30503):
DOC: `numpy.select`: fix `default` parameter docstring...
- [#​30504](https://redirect.github.com/numpy/numpy/pull/30504):
REV: Revert part of
[#​30164](https://redirect.github.com/numpy/numpy/issues/30164)
([#​30500](https://redirect.github.com/numpy/numpy/issues/30500))
- [#​30506](https://redirect.github.com/numpy/numpy/pull/30506):
TYP: `numpy.select`: allow passing array-like `default`...
- [#​30507](https://redirect.github.com/numpy/numpy/pull/30507):
MNT: use if constexpr for compile-time branch selection
- [#​30513](https://redirect.github.com/numpy/numpy/pull/30513):
BUG: Fix leak in flat assignment iterator
- [#​30516](https://redirect.github.com/numpy/numpy/pull/30516):
BUG: fix heap overflow in fixed-width string multiply
([#​30511](https://redirect.github.com/numpy/numpy/issues/30511))
- [#​30523](https://redirect.github.com/numpy/numpy/pull/30523):
BUG: Ensure summed weights returned by np.average always are...
- [#​30527](https://redirect.github.com/numpy/numpy/pull/30527):
TYP: Fix return type of histogram2d
- [#​30594](https://redirect.github.com/numpy/numpy/pull/30594):
MAINT: avoid passing ints to random functions that take double...
- [#​30595](https://redirect.github.com/numpy/numpy/pull/30595):
BLD: Avoiding conflict with pygit2 for static build
- [#​30596](https://redirect.github.com/numpy/numpy/pull/30596):
MAINT: Fix msvccompiler missing error on FreeBSD
- [#​30608](https://redirect.github.com/numpy/numpy/pull/30608):
BLD: update vendored Meson to 1.9.2
- [#​30620](https://redirect.github.com/numpy/numpy/pull/30620):
ENH: use more fine-grained critical sections in array coercion...
- [#​30623](https://redirect.github.com/numpy/numpy/pull/30623):
BUG: Undo result type change of quantile/percentile but keep...
###
[`v2.4.0`](https://redirect.github.com/numpy/numpy/releases/tag/v2.4.0):
2.4.0 (Dec 20, 2025)
[Compare
Source](https://redirect.github.com/numpy/numpy/compare/v2.3.5...v2.4.0)
##### NumPy 2.4.0 Release Notes
The NumPy 2.4.0 release continues the work to improve free threaded
Python
support, user dtypes implementation, and annotations. There are many
expired
deprecations and bug fixes as well.
This release supports Python versions 3.11-3.14
##### Highlights
Apart from annotations and `same_value` kwarg, the 2.4 highlights are
mostly
of interest to downstream developers. They should help in implementing
new user
dtypes.
- Many annotation improvements. In particular, runtime signature
introspection.
- New `casting` kwarg `'same_value'` for casting by value.
- New `PyUFunc_AddLoopsFromSpec` function that can be used to add user
sort
loops using the `ArrayMethod` API.
- New `__numpy_dtype__` protocol.
##### Deprecations
##### Setting the `strides` attribute is deprecated
Setting the strides attribute is now deprecated since mutating
an array is unsafe if an array is shared, especially by multiple
threads. As an alternative, you can create a new view (no copy) via:
- `np.lib.stride_tricks.strided_window_view` if applicable,
- `np.lib.stride_tricks.as_strided` for the general case,
- or the `np.ndarray` constructor (`buffer` is the original array) for a
light-weight version.
([gh-28925](https://redirect.github.com/numpy/numpy/pull/28925))
##### Positional `out` argument to `np.maximum`, `np.minimum` is
deprecated
Passing the output array `out` positionally to `numpy.maximum` and
`numpy.minimum` is deprecated. For example, `np.maximum(a, b, c)` will
emit
a deprecation warning, since `c` is treated as the output buffer rather
than
a third input.
Always pass the output with the keyword form, e.g. `np.maximum(a, b,
out=c)`.
This makes intent clear and simplifies type annotations.
([gh-29052](https://redirect.github.com/numpy/numpy/pull/29052))
##### `align=` must be passed as boolean to `np.dtype()`
When creating a new `dtype` a `VisibleDeprecationWarning` will be given
if
`align=` is not a boolean. This is mainly to prevent accidentally
passing a
subarray align flag where it has no effect, such as `np.dtype("f8", 3)`
instead of `np.dtype(("f8", 3))`. We strongly suggest to always pass
`align=` as a keyword argument.
([gh-29301](https://redirect.github.com/numpy/numpy/pull/29301))
##### Assertion and warning control utilities are deprecated
`np.testing.assert_warns` and `np.testing.suppress_warnings` are
deprecated. Use `warnings.catch_warnings`, `warnings.filterwarnings`,
`pytest.warns`, or `pytest.filterwarnings` instead.
([gh-29550](https://redirect.github.com/numpy/numpy/pull/29550))
##### `np.fix` is pending deprecation
The `numpy.fix` function will be deprecated in a future release. It is
recommended to use `numpy.trunc` instead, as it provides the same
functionality of truncating decimal values to their integer parts.
Static type
checkers might already report a warning for the use of `numpy.fix`.
([gh-30168](https://redirect.github.com/numpy/numpy/pull/30168))
##### in-place modification of `ndarray.shape` is pending deprecation
Setting the `ndarray.shape` attribute directly will be deprecated in a
future
release. Instead of modifying the shape in place, it is recommended to
use the
`numpy.reshape` function. Static type checkers might already report a
warning for assignments to `ndarray.shape`.
([gh-30282](https://redirect.github.com/numpy/numpy/pull/30282))
##### Deprecation of `numpy.lib.user_array.container`
The `numpy.lib.user_array.container` class is deprecated and will be
removed
in a future version.
([gh-30284](https://redirect.github.com/numpy/numpy/pull/30284))
##### Expired deprecations
##### Removed deprecated `MachAr` runtime discovery mechanism.
([gh-29836](https://redirect.github.com/numpy/numpy/pull/29836))
##### Raise `TypeError` on attempt to convert array with `ndim > 0` to
scalar
Conversion of an array with `ndim > 0` to a scalar was deprecated in
NumPy
1.25. Now, attempting to do so raises `TypeError`. Ensure you extract a
single element from your array before performing this operation.
([gh-29841](https://redirect.github.com/numpy/numpy/pull/29841))
##### Removed numpy.linalg.linalg and numpy.fft.helper
The following were deprecated in Nu
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Theo Pascoli <theo.pascoli@rte-france.com>
The existing lock classes (
FileLock,SoftFileLock) only support exclusive locking -- every caller blocks every other caller, even when most only need to read. This is fine for write-heavy workloads, but read-heavy ones pay an unnecessary serialization cost. 🔒This PR adds
ReadWriteLock, a cross-process shared/exclusive lock backed by SQLite transactions. Multiple processes can hold a read lock simultaneously while write locks remain exclusive. The lock is reentrant within the same mode (nested reads or nested writes from the same thread), but upgrading from read to write or downgrading from write to read raisesRuntimeErrorto prevent deadlocks. Write locks are pinned to the acquiring thread.The implementation uses SQLite's built-in
BEGIN TRANSACTION(shared) andBEGIN EXCLUSIVE TRANSACTION(exclusive) withjournal_mode=MEMORYrather than WAL, because WAL would allow readers to proceed during an exclusive write -- exactly the behavior we need to prevent. A double-check locking pattern serializes concurrent threads through athreading.Lockbefore touching SQLite, andbusy_timeoutis recomputed after each potentially-blocking pragma to keep timeout accounting accurate. Instances are singletons by default (keyed by resolved path via aWeakValueDictionary), matching the pattern established byBaseFileLock'sis_singletonparameter.📝 The docs (
docs/index.rst) have been substantially reworked: a new section hierarchy (Usage/Lock types), platform resolution details forFileLock, a dedicatedReadWriteLocksection with usage examples, limitations for every lock type, async variant mentions in "Choosing the right lock", and singleton lock documentation. The changelog has been backfilled from v3.12.1 through v3.20.3. Code examples now usepathlib.Pathand descriptive variable names throughout. Existing docstrings in_api.py,asyncio.py, and_soft.pyhave been expanded with:param:/:raises:/:return:tags andversionaddeddirectives.♻️ The
_read_write.pysource extracts shared acquire logic into_acquire(),_validate_reentrant(), and_configure_and_begin()to eliminate ~50 lines of duplication betweenacquire_readandacquire_write. Internal attributes use underscore-prefixed names (_con,_lock_level, etc.) and imports are relative throughout.A PyPy-specific
test_virtualenvskip was added due to a segfault in PyPy's_sqlite3.Cursor.__del__._resetduring garbage collection -- no upstream issue was found for this bug.