Important
The v1.25.0 release never published: its riscv64 wheel job hit the job timeout, so no packages reached PyPI and no GitHub release was created. No changes were lost; everything intended for v1.25.0 shipped in v1.25.1. Its changelog entries are reproduced below.
Contributor-facing changes
-
Stopped running the test suite inside the riscv64 wheel builds; every wheel
for that architecture is built under emulation and the test run did not fit
in the job timeout -- by :user:bdraco.Related issues and pull requests on GitHub:
#1906.
v1.25.0
(2026-09-15)
Bug fixes
-
Made the C and pure Python quoting implementations reject
%insafe
orprotectedwhen requoting and a space insafeorprotectedfor
query strings, since the two implementations disagreed on those
configurations -- by :user:bdraco.Related issues and pull requests on GitHub:
#1869. -
Made the pure Python quoter reject non-ASCII
safeandprotected
characters when it is created, the same way the C extension does
-- by :user:bdraco.Related issues and pull requests on GitHub:
#1893. -
Fixed :attr:
URL.query <yarl.URL.query>returning empty fields and keeping
invalid percent-encoded UTF-8 as is, a regression in 1.19.0. It matches
:func:urllib.parse.parse_qslagain, and so do the methods built on it,
:meth:~yarl.URL.update_query, :meth:~yarl.URL.without_query_paramsand
:meth:~yarl.URL.human_repr, which also no longer double encode those escapes
-- by :user:bdraco.Related issues and pull requests on GitHub:
#1899.
Features
-
Added :func:
~yarl.query_to_pairs, a faster replacement for
:func:urllib.parse.parse_qslwithkeep_blank_values=Truethat also
takesmax_fieldsandencodingarguments -- by :user:bdraco.Related issues and pull requests on GitHub:
#1899.
Contributor-facing changes
-
Added CodSpeed benchmarks for unquoting long strings, decoding
+as a space, and parsing real world form bodies and large query
strings
-- by :user:bdraco.Related issues and pull requests on GitHub:
#1884. -
Stopped running the test suite inside the wheel build jobs outside of
release builds, since the test matrix already installs and tests the
same wheels, and added Python 3.15 and 3.15t to the test matrix so
those wheels stay covered. Release builds still test every wheel, and
all release checks in the CI workflow now usegithub.ref_type
-- by :user:bdraco. -
Added tests that check the C and pure Python unquoting implementations
produce the same output, including long runs and invalid or incomplete
UTF-8 escapes, and thatplus=Truematches
:func:urllib.parse.unquote_plusfor valid input -- by :user:bdraco.Related issues and pull requests on GitHub:
#1888. -
Added tests that check the C and pure Python unquoting implementations
agree for any combination ofignore,qsandplus, including
non-ASCIIignorecharacters -- by :user:bdraco.Related issues and pull requests on GitHub:
#1890. -
Added CodSpeed benchmarks for the pure Python unquoter, which is used
when the C extension is not available, and for unquoting with several
unsafe characters -- by :user:bdraco.Related issues and pull requests on GitHub:
#1891. -
Added tests that check the C and pure Python unquoting implementations
never return a string longer than their input -- by :user:bdraco.Related issues and pull requests on GitHub:
#1896. -
Added tests that pin how the C and pure Python unquoting implementations
handle overlong, surrogate and out of range UTF-8 escapes, the smallest and
largest valid sequences, and sequences interrupted by other characters, so
they also run when hypothesis is not installed -- by :user:bdraco.Related issues and pull requests on GitHub:
#1898.
Miscellaneous internal changes
-
Improved performance of the C unquoter, especially for long strings and
strings with many percent-encoded characters -- by :user:bdraco.Related issues and pull requests on GitHub:
#1886. -
Improved performance of the pure Python unquoter, especially for long
strings and strings with many percent-encoded characters
-- by :user:bdraco.Related issues and pull requests on GitHub:
#1889. -
Removed the unused
unsafeoption from the internal unquoting classes;
the unquoting done by :class:~yarl.URLnever depended on it
-- by :user:bdraco.Related issues and pull requests on GitHub:
#1894. -
Replaced magic numbers in the C quoting helpers with named constants
-- by :user:bdraco.Related issues and pull requests on GitHub:
#1897. -
Made the internal unquoting classes, C and pure Python, reject
ignore
characters that are decoded anyway, such as letters or+when not parsing
a query string, instead of silently accepting them -- by :user:bdraco.Related issues and pull requests on GitHub:
#1900. -
Removed unused string constants from the C and pure Python quoting modules
-- by :user:bdraco.Related issues and pull requests on GitHub:
#1901. -
Simplified the C unquoter so it writes the escapes for ignored characters
itself instead of calling the quoter, which also made it slightly faster
-- by :user:bdraco.Related issues and pull requests on GitHub:
#1902. -
Made the internal unquoting classes, C and pure Python, reject non-ASCII
ignorecharacters, as the quoting classes already do forsafe
-- by :user:bdraco.Related issues and pull requests on GitHub:
#1903. -
Simplified the pure Python unquoter so it writes the escapes for ignored
characters itself instead of calling the quoter, which also made decoding
escaped ASCII characters faster -- by :user:bdraco.Related issues and pull requests on GitHub:
#1904.