Bug fixes
-
Joining URLs with empty segments has been changed
to match :rfc:3986
.Previously empty segments would be removed from path,
breaking use-cases such as.. code-block:: python
URL("https://web.archive.org/web/") / "https://github.com/"
Now :meth:
/ operation <yarl.URL.__truediv__>
and :meth:URL.joinpath() <yarl.URL.joinpath>
keep empty segments, but do not introduce new empty segments.
e.g... code-block:: python
URL("https://example.org/") / ""
does not introduce an empty segment.
-- by :user:
commonism
and :user:youtux
Related issues and pull requests on GitHub:
#1026. -
The default protocol ports of well-known URI schemes are now taken into account
during the normalization of the URL string representation in accordance with
:rfc:3986#section-3.2.3
.Specified ports are removed from the :class:
str
representation of a :class:~yarl.URL
if the port matches the scheme's default port -- by :user:commonism
.Related issues and pull requests on GitHub:
#1033. -
:meth:
URL.join() <yarl.URL.join>
has been changed to match
:rfc:3986
and align with
:meth:/ operation <yarl.URL.__truediv__>
and :meth:URL.joinpath() <yarl.URL.joinpath>
when joining URLs with empty segments.
Previously :py:func:urllib.parse.urljoin
was used,
which has known issues with empty segments
(python/cpython#84774 <https://github.com/python/cpython/issues/84774>
_).Due to the semantics of :meth:
URL.join() <yarl.URL.join>
, joining an
URL with scheme requires making it relative, prefixing with./
... code-block:: pycon
URL("https://web.archive.org/web/").join(URL("./https://github.com/aio-libs/yarl"))
URL('https://web.archive.org/web/https://github.com/aio-libs/yarl')Empty segments are honored in the base as well as the joined part.
.. code-block:: pycon
URL("https://web.archive.org/web/https://").join(URL("github.com/aio-libs/yarl"))
URL('https://web.archive.org/web/https://github.com/aio-libs/yarl')-- by :user:
commonism
Related issues and pull requests on GitHub:
#1039.
Removals and backward incompatible breaking changes
-
Stopped decoding
%2F
(/
) inURL.path
, as this could lead to code incorrectly treating it as a path separator
-- by :user:Dreamsorcerer
.Related issues and pull requests on GitHub:
#1057.
Improved documentation
-
On the :doc:
Contributing docs <contributing/guidelines>
page,
a link to theTowncrier philosophy
has been fixed.Related issues and pull requests on GitHub:
#981. -
The pre-existing :meth:
/ magic method <yarl.URL.__truediv__>
has been documented in the API reference -- by :user:commonism
.Related issues and pull requests on GitHub:
#1026.
Packaging updates and notes for downstreams
-
A flaw in the logic for copying the project directory into a
temporary folder that led to infinite recursion when :envvar:TMPDIR
was set to a project subdirectory path. This was happening in Fedora
and its downstream due to the use ofpyproject-rpm-macros <https://src.fedoraproject.org/rpms/pyproject-rpm-macros>
__. It was
only reproducible withpip wheel
and was not affecting the
pyproject-build
users.-- by :user:
hroncok
and :user:webknjaz
-
Support Python 3.13 and publish non-free-threaded wheels
Related issues and pull requests on GitHub:
#1054.
Contributor-facing changes
-
The CI/CD setup has been updated to test
arm64
wheels
under macOS 14, except for Python 3.7 that is unsupported
in that environment -- by :user:webknjaz
.Related issues and pull requests on GitHub:
#1015. -
Removed unused type ignores and casts -- by :user:
hauntsaninja
.Related issues and pull requests on GitHub:
#1031.
Miscellaneous internal changes
-
port
,scheme
, andraw_host
are nowcached_property
-- by :user:bdraco
.aiohttp
accesses these properties quite often, which cause :mod:urllib
to build the_hostinfo
property every time.port
,scheme
, andraw_host
are now cached properties, which will improve performance.
1.9.4 (2023-12-06)
Bug fixes
-
Started raising :py:exc:
TypeError
when a string value is passed into
:py:meth:~yarl.URL.build
as theport
argument -- by :user:commonism
.Previously the empty string as port would create malformed URLs when rendered as string representations. (#883)
Packaging updates and notes for downstreams
-
The leading
--
has been dropped from the :pep:517
in-tree build
backend config setting names.--pure-python
is now justpure-python
-- by :user:webknjaz
.The usage now looks as follows:
.. code-block:: console
$ python -m build \ --config-setting=pure-python=true \ --config-setting=with-cython-tracing=true
(#963)
Contributor-facing changes
-
A step-by-step :doc:
Release Guide <contributing/release_guide>
guide has
been added, describing how to release yarl -- by :user:webknjaz
.This is primarily targeting maintainers. (#960)
-
Coverage collection has been implemented for the Cython modules
-- by :user:webknjaz
.It will also be reported to Codecov from any non-release CI jobs.
To measure coverage in a development environment, yarl can be
installed in editable mode:.. code-block:: console
$ python -Im pip install -e .
Editable install produces C-files required for the Cython coverage
plugin to map the measurements back to the PYX-files. -
It is now possible to request line tracing in Cython builds using the
with-cython-tracing
:pep:517
config setting
-- :user:webknjaz
.This can be used in CI and development environment to measure coverage
on Cython modules, but is not normally useful to the end-users or
downstream packagers.Here's a usage example:
.. code-block:: console
$ python -Im pip install . --config-settings=with-cython-tracing=true
For editable installs, this setting is on by default. Otherwise, it's
off unless requested explicitly.The following produces C-files required for the Cython coverage
plugin to map the measurements back to the PYX-files:.. code-block:: console
$ python -Im pip install -e .
Alternatively, the
YARL_CYTHON_TRACING=1
environment variable
can be set to do the same as the :pep:517
config setting.
1.9.3 (2023-11-20)
Bug fixes
- Stopped dropping trailing slashes in :py:meth:
~yarl.URL.joinpath
-- by :user:gmacon
. (#862, #866) - Started accepting string subclasses in :meth:
~yarl.URL.__truediv__
operations (URL / segment
) -- by :user:mjpieters
. (#871, #884) - Fixed the human representation of URLs with square brackets in usernames and passwords -- by :user:
mjpieters
. (#876, #882) - Updated type hints to include
URL.missing_port()
,URL.__bytes__()
and theencoding
argument to :py:meth:~yarl.URL.joinpath
-- by :user:mjpieters
. (#891)
Packaging updates and notes for downstreams
-
Integrated Cython 3 to enable building yarl under Python 3.12 -- by :user:
mjpieters
. (#829, #881) -
Declared modern
setuptools.build_meta
as the :pep:517
build
backend in :file:pyproject.toml
explicitly -- by :user:webknjaz
. (#886) -
Converted most of the packaging setup into a declarative :file:
setup.cfg
config -- by :user:webknjaz
. (#890) -
The packaging is replaced from an old-fashioned :file:
setup.py
to an
in-tree :pep:517
build backend -- by :user:webknjaz
.Whenever the end-users or downstream packagers need to build
yarl
from
source (a Git checkout or an sdist), they may pass aconfig_settings
flag--pure-python
. If this flag is not set, a C-extension will be built
and included into the distribution.Here is how this can be done with
pip
:.. code-block:: console
$ python -m pip install . --config-settings=--pure-python=false
This will also work with
-e | --editable
.The same can be achieved via
pypa/build
:.. code-block:: console
$ python -m build --config-setting=--pure-python=false
Adding
-w | --wheel
can forcepypa/build
produce a wheel from source
directly, as opposed to building ansdist
and then building from it. (#893).. attention::
v1.9.3 was the only version using the
--pure-python
setting name.
Later versions dropped the--
prefix, making it justpure-python
. -
Declared Python 3.12 supported officially in the distribution package metadata
-- by :user:edgarrmondragon
. (#942)
Contributor-facing changes
-
A regression test for no-host URLs was added per #821
and :rfc:3986
-- by :user:kenballus
. (#821, #822) -
Started testing yarl against Python 3.12 in CI -- by :user:
mjpieters
. (#881) -
All Python 3.12 jobs are now marked as required to pass in CI
-- by :user:edgarrmondragon
. (#942) -
MyST is now integrated in Sphinx -- by :user:
webknjaz
.This allows the contributors to author new documents in Markdown
when they have difficulties with going straight RST. (#953)
1.9.2 (2023-04-25)
Bugfixes
- Fix regression with :meth:
~yarl.URL.__truediv__
and absolute URLs with empty paths causing the raw path to lack the leading/
.
(#854 <https://github.com/aio-libs/yarl/issues/854>
_)
1.9.1 (2023-04-21)
Bugfixes
- Marked tests that fail on older Python patch releases (< 3.7.10, < 3.8.8 and < 3.9.2) as expected to fail due to missing a security fix for CVE-2021-23336. (
#850 <https://github.com/aio-libs/yarl/issues/850>
_)
1.9.0 (2023-04-19)
This release was never published to PyPI, due to issues with the build process.
Features
- Added
URL.joinpath(*elements)
, to create a new URL appending multiple path elements. (#704 <https://github.com/aio-libs/yarl/issues/704>
_) - Made :meth:
URL.__truediv__() <yarl.URL.__truediv__>
returnNotImplemented
if called with an
unsupported type — by :user:michaeljpeters
.
(#832 <https://github.com/aio-libs/yarl/issues/832>
_)
Bugfixes
- Path normalization for absolute URLs no longer raises a ValueError exception
when..
segments would otherwise go beyond the URL path root.
(#536 <https://github.com/aio-libs/yarl/issues/536>
_) - Fixed an issue with update_query() not getting rid of the query when argument is None. (
#792 <https://github.com/aio-libs/yarl/issues/792>
_) - Added some input restrictions on with_port() function to prevent invalid boolean inputs or out of valid port inputs; handled incorrect 0 port representation. (
#793 <https://github.com/aio-libs/yarl/issues/793>
_) - Made :py:meth:
~yarl.URL.build
raise a :py:exc:TypeError
if thehost
argument is :py:data:None
— by :user:paulpapacz
. (#808 <https://github.com/aio-libs/yarl/issues/808>
_) - Fixed an issue with
update_query()
getting rid of the query when the argument
is empty but notNone
. (#845 <https://github.com/aio-libs/yarl/issues/845>
_)
Misc
#220 <https://github.com/aio-libs/yarl/issues/220>
_
1.8.2 (2022-12-03)
This is the first release that started shipping wheels for Python 3.11.
1.8.1 (2022-08-01)
Misc
#694 <https://github.com/aio-libs/yarl/issues/694>
,#699 <https://github.com/aio-libs/yarl/issues/699>
,#700 <https://github.com/aio-libs/yarl/issues/700>
,#701 <https://github.com/aio-libs/yarl/issues/701>
,#702 <https://github.com/aio-libs/yarl/issues/702>
,#703 <https://github.com/aio-libs/yarl/issues/703>
,#739 <https://github.com/aio-libs/yarl/issues/739>
_
1.8.0 (2022-08-01)
Features
- Added
URL.raw_suffix
,URL.suffix
,URL.raw_suffixes
,URL.suffixes
,URL.with_suffix
. (#613 <https://github.com/aio-libs/yarl/issues/613>
_)
Improved Documentation
- Fixed broken internal references to :meth:
~yarl.URL.human_repr
.
(#665 <https://github.com/aio-libs/yarl/issues/665>
_) - Fixed broken external references to :doc:
multidict:index
docs. (#665 <https://github.com/aio-libs/yarl/issues/665>
_)
Deprecations and Removals
- Dropped Python 3.6 support. (
#672 <https://github.com/aio-libs/yarl/issues/672>
_)
Misc
#646 <https://github.com/aio-libs/yarl/issues/646>
,#699 <https://github.com/aio-libs/yarl/issues/699>
,#701 <https://github.com/aio-libs/yarl/issues/701>
_
1.7.2 (2021-11-01)
Bugfixes
- Changed call in
with_port()
to stop reencoding parts of the URL that were already encoded. (#623 <https://github.com/aio-libs/yarl/issues/623>
_)
1.7.1 (2021-10-07)
Bugfixes
- Fix 1.7.0 build error
1.7.0 (2021-10-06)
Features
- Add
__bytes__()
magic method so thatbytes(url)
will work and use optimal ASCII encoding.
(#582 <https://github.com/aio-libs/yarl/issues/582>
_) - Started shipping platform-specific arm64 wheels for Apple Silicon. (
#622 <https://github.com/aio-libs/yarl/issues/622>
_) - Started shipping platform-specific wheels with the
musl
tag targeting typical Alpine Linux runtimes. (#622 <https://github.com/aio-libs/yarl/issues/622>
_) - Added support for Python 3.10. (
#622 <https://github.com/aio-libs/yarl/issues/622>
_)
1.6.3 (2020-11-14)
Bugfixes
- No longer loose characters when decoding incorrect percent-sequences (like
%e2%82%f8
). All non-decodable percent-sequences are now preserved.
#517 <https://github.com/aio-libs/yarl/issues/517>
_ - Provide x86 Windows wheels.
#535 <https://github.com/aio-libs/yarl/issues/535>
_
1.6.2 (2020-10-12)
Bugfixes
- Provide generated
.c
files in TarBall distribution.
#530 <https://github.com/aio-libs/multidict/issues/530>
_
1.6.1 (2020-10-12)
Features
- Provide wheels for
aarch64
,i686
,ppc64le
,s390x
architectures on
Linux as well asx86_64
.
#507 <https://github.com/aio-libs/yarl/issues/507>
_ - Provide wheels for Python 3.9.
#526 <https://github.com/aio-libs/yarl/issues/526>
_
Bugfixes
human_repr()
now always produces valid representation equivalent to the original URL (if the original URL is valid).
#511 <https://github.com/aio-libs/yarl/issues/511>
_- Fixed requoting a single percent followed by a percent-encoded character in the Cython implementation.
#514 <https://github.com/aio-libs/yarl/issues/514>
_ - Fix ValueError when decoding
%
which is not followed by two hexadecimal digits.
#516 <https://github.com/aio-libs/yarl/issues/516>
_ - Fix decoding
%
followed by a space and hexadecimal digit.
#520 <https://github.com/aio-libs/yarl/issues/520>
_ - Fix annotation of
with_query()
/update_query()
methods forkey=[val1, val2]
case.
#528 <https://github.com/aio-libs/yarl/issues/528>
_
Removal
- Drop Python 3.5 support; Python 3.6 is the minimal supported Python version.
1.6.0 (2020-09-23)
Features
- Allow for int and float subclasses in query, while still denying bool.
#492 <https://github.com/aio-libs/yarl/issues/492>
_
Bugfixes
- Do not requote arguments in
URL.build()
,with_xxx()
and in/
operator.
#502 <https://github.com/aio-libs/yarl/issues/502>
_ - Keep IPv6 brackets in
origin()
.
#504 <https://github.com/aio-libs/yarl/issues/504>
_
1.5.1 (2020-08-01)
Bugfixes
- Fix including relocated internal
yarl._quoting_c
C-extension into published PyPI dists.
#485 <https://github.com/aio-libs/yarl/issues/485>
_
Misc
#484 <https://github.com/aio-libs/yarl/issues/484>
_
1.5.0 (2020-07-26)
Features
-
Convert host to lowercase on URL building.
#386 <https://github.com/aio-libs/yarl/issues/386>
_ -
Allow using
mod
operator (%
) for updating query string (an alias forupdate_query()
method).
#435 <https://github.com/aio-libs/yarl/issues/435>
_ -
Allow use of sequences such as
list
andtuple
in the values
of a mapping such asdict
to represent that a key has many values::url = URL("http://example.com") assert url.with_query({"a": [1, 2]}) == URL("http://example.com/?a=1&a=2")
#443 <https://github.com/aio-libs/yarl/issues/443>
_ -
Support
URL.build()
with scheme and path (creates a relative URL).
#464 <https://github.com/aio-libs/yarl/issues/464>
_ -
Cache slow IDNA encode/decode calls.
#476 <https://github.com/aio-libs/yarl/issues/476>
_ -
Add
@final
/Final
type hints
#477 <https://github.com/aio-libs/yarl/issues/477>
_ -
Support URL authority/raw_authority properties and authority argument of
URL.build()
method.
#478 <https://github.com/aio-libs/yarl/issues/478>
_ -
Hide the library implementation details, make the exposed public list very clean.
#483 <https://github.com/aio-libs/yarl/issues/483>
_
Bugfixes
- Fix tests with newer Python (3.7.6, 3.8.1 and 3.9.0+).
#409 <https://github.com/aio-libs/yarl/issues/409>
_ - Fix a bug where query component, passed in a form of mapping or sequence, is unquoted in unexpected way.
#426 <https://github.com/aio-libs/yarl/issues/426>
_ - Hide
Query
andQueryVariable
type aliases in__init__.pyi
, now they are prefixed with underscore.
#431 <https://github.com/aio-libs/yarl/issues/431>
_ - Keep IPv6 brackets after updating port/user/password.
#451 <https://github.com/aio-libs/yarl/issues/451>
_
1.4.2 (2019-12-05)
Features
- Workaround for missing
str.isascii()
in Python 3.6
#389 <https://github.com/aio-libs/yarl/issues/389>
_
1.4.1 (2019-11-29)
- Fix regression, make the library work on Python 3.5 and 3.6 again.
1.4.0 (2019-11-29)
-
Distinguish an empty password in URL from a password not provided at all (#262)
-
Fixed annotations for optional parameters of
URL.build
(#309) -
Use None as default value of
user
parameter ofURL.build
(#309) -
Enforce building C Accelerated modules when installing from source tarball, use
YARL_NO_EXTENSIONS
environment variable for falling back to (slower) Pure Python
implementation (#329) -
Drop Python 3.5 support
-
Fix quoting of plus in path by pure python version (#339)
-
Don't create a new URL if fragment is unchanged (#292)
-
Included in error message the path that produces starting slash forbidden error (#376)
-
Skip slow IDNA encoding for ASCII-only strings (#387)
1.3.0 (2018-12-11)
-
Fix annotations for
query
parameter (#207) -
An incoming query sequence can have int variables (the same as for
Mapping type) (#208) -
Add
URL.explicit_port
property (#218) -
Give a friendlier error when port can't be converted to int (#168)
-
bool(URL())
now returnsFalse
(#272)
1.2.6 (2018-06-14)
- Drop Python 3.4 trove classifier (#205)
1.2.5 (2018-05-23)
- Fix annotations for
build
(#199)
1.2.4 (2018-05-08)
- Fix annotations for
cached_property
(#195)
1.2.3 (2018-05-03)
- Accept
str
subclasses inURL
constructor (#190)
1.2.2 (2018-05-01)
- Fix build
1.2.1 (2018-04-30)
- Pin minimal required Python to 3.5.3 (#189)
1.2.0 (2018-04-30)
-
Forbid inheritance, replace
__init__
with__new__
(#171) -
Support PEP-561 (provide type hinting marker) (#182)
1.1.1 (2018-02-17)
- Fix performance regression: don't encode empty
netloc
(#170)
1.1.0 (2018-01-21)
- Make pure Python quoter consistent with Cython version (#162)
1.0.0 (2018-01-15)
-
Use fast path if quoted string does not need requoting (#154)
-
Speed up quoting/unquoting by
_Quoter
and_Unquoter
classes (#155) -
Drop
yarl.quote
andyarl.unquote
public functions (#155) -
Add custom string writer, reuse static buffer if available (#157)
Code is 50-80 times faster than Pure Python version (was 4-5 times faster) -
Don't recode IP zone (#144)
-
Support
encoded=True
inyarl.URL.build()
(#158) -
Fix updating query with multiple keys (#160)
0.18.0 (2018-01-10)
- Fallback to IDNA 2003 if domain name is not IDNA 2008 compatible (#152)
0.17.0 (2017-12-30)
- Use IDNA 2008 for domain name processing (#149)
0.16.0 (2017-12-07)
- Fix raising
TypeError
byurl.query_string()
after
url.with_query({})
(empty mapping) (#141)
0.15.0 (2017-11-23)
- Add
raw_path_qs
attribute (#137)
0.14.2 (2017-11-14)
- Restore
strict
parameter as no-op inquote
/unquote
0.14.1 (2017-11-13)
- Restore
strict
parameter as no-op for sake of compatibility with
aiohttp 2.2
0.14.0 (2017-11-11)
0.13.0 (2017-10-01)
-
Document
encoded
parameter (#102) -
Support relative URLs like
'?key=value'
(#100) -
Unsafe encoding for QS fixed. Encode
;
character in value parameter (#104) -
Process passwords without user names (#95)
0.12.0 (2017-06-26)
-
Properly support paths without leading slash in
URL.with_path()
(#90) -
Enable type annotation checks
0.11.0 (2017-06-26)
0.10.3 (2017-06-13)
- Prevent double URL arguments unquoting (#83)
0.10.2 (2017-05-05)
- Unexpected hash behavior (#75)
0.10.1 (2017-05-03)
0.10.0 (2017-03-14)
0.9.8 (2017-02-16)
- Do not quote
:
in path
0.9.7 (2017-02-16)
0.9.6 (2017-02-15)
- Revert backward incompatible change (BaseURL)
0.9.5 (2017-02-14)
- Fix BaseURL rich comparison support
0.9.4 (2017-02-14)
- Use BaseURL
0.9.3 (2017-02-14)
- Added BaseURL
0.9.2 (2017-02-08)
- Remove debug print
0.9.1 (2017-02-07)
- Do not lose tail chars (#45)
0.9.0 (2017-02-07)
-
Allow to quote
%
in non strict mode (#21) -
Incorrect parsing of query parameters with %3B (;) inside (#34)
-
Fix core dumps (#41)
-
tmpbuf
- compiling error (#43) -
Added
URL.update_path()
method -
Added
URL.update_query()
method (#47)
0.8.1 (2016-12-03)
- Fix broken aiohttp: revert back
quote
/unquote
.
0.8.0 (2016-12-03)
-
Support more verbose error messages in
.with_query()
(#24) -
Don't percent-encode
@
and:
in path (#32) -
Don't expose
yarl.quote
andyarl.unquote
, these functions are
part of private API
0.7.1 (2016-11-18)
- Accept not only
str
but all classes inherited fromstr
also (#25)
0.7.0 (2016-11-07)
- Accept
int
as value for.with_query()
0.6.0 (2016-11-07)
0.5.3 (2016-11-02)
- Don't use :py:class:
typing.NamedTuple
fields but indexes on URL construction
0.5.2 (2016-11-02)
- Inline
_encode
class method
0.5.1 (2016-11-02)
- Make URL construction faster by removing extra classmethod calls
0.5.0 (2016-11-02)
- Add Cython optimization for quoting/unquoting
- Provide binary wheels
0.4.3 (2016-09-29)
- Fix typing stubs
0.4.2 (2016-09-29)
- Expose
quote()
andunquote()
as public API
0.4.1 (2016-09-28)
- Support empty values in query (
'/path?arg'
)
0.4.0 (2016-09-27)
- Introduce
relative()
(#16)
0.3.2 (2016-09-27)
- Typo fixes #15
0.3.1 (2016-09-26)
- Support sequence of pairs as
with_query()
parameter
0.3.0 (2016-09-26)
- Introduce
is_default_port()
0.2.1 (2016-09-26)
- Raise ValueError for URLs like 'http://:8080/'
0.2.0 (2016-09-18)
-
Avoid doubling slashes when joining paths (#13)
-
Appending path starting from slash is forbidden (#12)
0.1.4 (2016-09-09)
- Add
kwargs
support forwith_query()
(#10)
0.1.3 (2016-09-07)
-
Document
with_query()
,with_fragment()
andorigin()
-
Allow
None
forwith_query()
andwith_fragment()
0.1.2 (2016-09-07)
- Fix links, tune docs theme.
0.1.1 (2016-09-06)
- Update README, old version used obsolete API
0.1.0 (2016-09-06)
- The library was deeply refactored, bytes are gone away but all
accepted strings are encoded if needed.
0.0.1 (2016-08-30)
- The first release.