Bug fixes
---------
- Upgraded the C-API macros that have been deprecated in Python 3.9
and later removed in 3.13 -- by iemelyanov[💰](https://github.com/sponsors/iemelyanov).
*Related issues and pull requests on GitHub:*
862, 864, 868, 898.
- Reverted to using the public argument parsing API
`PyArg_ParseTupleAndKeywords()` under Python 3.12
-- by charles-dyfis-net[💰](https://github.com/sponsors/charles-dyfis-net) and webknjaz[💰](https://github.com/sponsors/webknjaz).
The effect is that this change prevents build failures with
clang 16.9.6 and gcc-14 reported in 926. It also
fixes a segmentation fault crash caused by passing keyword
arguments to `MultiDict.getall()` discovered by jonaslb[💰](https://github.com/sponsors/jonaslb)
and hroncok[💰](https://github.com/sponsors/hroncok) while examining the problem.
*Related issues and pull requests on GitHub:*
862, 909, 926, 929.
- Fixed a `SystemError: null argument to internal routine` error on
a `MultiDict.items().isdisjoint()` call when using C Extensions.
*Related issues and pull requests on GitHub:*
927.
Improved documentation
----------------------
- On the [Contributing docs](https://github.com/aio-libs/multidict/blob/master/CHANGES/#readme)
page, a link to the `Towncrier philosophy` has been fixed.
*Related issues and pull requests on GitHub:*
911.
Packaging updates and notes for downstreams
-------------------------------------------
- Stopped marking all files as installable package data -- by webknjaz[💰](https://github.com/sponsors/webknjaz).
This change helps `setuptools` understand that C-headers are
not to be installed under `lib/python3.{x}/site-packages/`.
*Related commits on GitHub:*
31e1170.
- Started publishing pure-python wheels to be installed as a fallback
-- by webknjaz[💰](https://github.com/sponsors/webknjaz).
*Related commits on GitHub:*
7ba0e72.
- Switched from `setuptools`' legacy backend (`setuptools.build_meta:__legacy__`)
to the modern one (`setuptools.build_meta`) by actually specifying the
the `[build-system] build-backend` option in `pyproject.toml`
-- by Jackenmen[💰](https://github.com/sponsors/Jackenmen).
*Related issues and pull requests on GitHub:*
802.
- Declared Python 3.12 supported officially in the
distribution package metadata -- by hugovk[💰](https://github.com/sponsors/hugovk).
*Related issues and pull requests on GitHub:*
877.
Contributor-facing changes
--------------------------
- The test framework has been refactored. In the previous state, the circular
imports reported in 837 caused the C-extension tests to be skipped.
Now, there is a set of the `pytest` fixtures that is set up in a parametrized
manner allowing to have a consistent way of accessing mirrored `multidict`
implementations across all the tests.
This change also implemented a pair of CLI flags (`--c-extensions` /
`--no-c-extensions`) that allow to explicitly request deselecting the tests
running against the C-extension.
-- by webknjaz[💰](https://github.com/sponsors/webknjaz).
*Related issues and pull requests on GitHub:*
98, 837, 915.
- Updated the test pins lockfile used in the
`cibuildwheel` test stage -- by hoodmane[💰](https://github.com/sponsors/hoodmane).
*Related issues and pull requests on GitHub:*
827.
- Added an explicit `void` for arguments in C-function signatures
which addresses the following compiler warning:
console
warning: a function declaration without a prototype is deprecated in all versions of C [-Wstrict-prototypes]
-- by hoodmane[💰](https://github.com/sponsors/hoodmane)
*Related issues and pull requests on GitHub:*
828.
- An experimental Python 3.13 job now runs in the CI
-- webknjaz[💰](https://github.com/sponsors/webknjaz).
*Related issues and pull requests on GitHub:*
920.
- Added test coverage for the bitwise `and`, bitwise `or`, `sub`, and `xor`
operators in the `multidict/_multidict_base.py` module. It also covers
`NotImplemented` and "`Iterable`-but-not-`Set`" cases there.
-- by a5r0n[💰](https://github.com/sponsors/a5r0n)
*Related issues and pull requests on GitHub:*
936.
- The version of pytest is now capped below 8, when running MyPy
against Python 3.7. This pytest release dropped support for
said runtime.
*Related issues and pull requests on GitHub:*
937.
----