Started raising :py
TypeError
when a string value is passed into :py~yarl.URL.build
as theport
argument -- bycommonism
.Previously the empty string as port would create malformed URLs when rendered as string representations. (
883
)
The leading
--
has been dropped from the517
in-tree build backend config setting names.--pure-python
is now justpure-python
-- bywebknjaz
.The usage now looks as follows:
$ python -m build \ --config-setting=pure-python=true \ --config-setting=with-cython-tracing=true
(
963
)
A step-by-step
Release Guide <contributing/release_guide>
guide has been added, describing how to release yarl -- bywebknjaz
.This is primarily targeting maintainers. (
960
)Coverage collection has been implemented for the Cython modules -- by
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:
$ 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.
961
It is now possible to request line tracing in Cython builds using the
with-cython-tracing
517
config setting --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:
$ 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:
$ python -Im pip install -e .
Alternatively, the
YARL_CYTHON_TRACING=1
environment variable can be set to do the same as the517
config setting.962
- Stopped dropping trailing slashes in :py
~yarl.URL.joinpath
-- bygmacon
. (862
,866
) - Started accepting string subclasses in
__truediv__()
operations (URL / segment
) -- bymjpieters
. (871
,884
) - Fixed the human representation of URLs with square brackets in usernames and passwords -- by
mjpieters
. (876
,882
) - Updated type hints to include
URL.missing_port()
,URL.__bytes__()
and theencoding
argument to :py~yarl.URL.joinpath
-- bymjpieters
. (891
)
- Integrated Cython 3 to enable building yarl under Python 3.12 -- by
mjpieters
. (829
,881
) - Declared modern
setuptools.build_meta
as the517
build backend inpyproject.toml
explicitly -- bywebknjaz
. (886
) - Converted most of the packaging setup into a declarative
setup.cfg
config -- bywebknjaz
. (890
) The packaging is replaced from an old-fashioned
setup.py
to an in-tree517
build backend -- bywebknjaz
.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
:$ python -m pip install . --config-settings=--pure-python=false
This will also work with
-e | --editable
.The same can be achieved via
pypa/build
:$ 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
edgarrmondragon
. (942
)
- A regression test for no-host URLs was added per
821
and3986
-- bykenballus
. (821
,822
) - Started testing yarl against Python 3.12 in CI -- by
mjpieters
. (881
) - All Python 3.12 jobs are now marked as required to pass in CI -- by
edgarrmondragon
. (942
) MyST is now integrated in Sphinx -- by
webknjaz
.This allows the contributors to author new documents in Markdown when they have difficulties with going straight RST. (
953
)
- Fix regression with
__truediv__
and absolute URLs with empty paths causing the raw path to lack the leading/
. (#854)
- 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)
This release was never published to PyPI, due to issues with the build process.
- Added
URL.joinpath(*elements)
, to create a new URL appending multiple path elements. (#704) - Made
URL.__truediv__()
returnNotImplemented
if called with an unsupported type — bymichaeljpeters
. (#832)
- Path normalization for absolute URLs no longer raises a ValueError exception when
..
segments would otherwise go beyond the URL path root. (#536) - Fixed an issue with update_query() not getting rid of the query when argument is None. (#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)
- Made :py
~yarl.URL.build
raise a :pyTypeError
if thehost
argument is :pyNone
— bypaulpapacz
. (#808) - Fixed an issue with
update_query()
getting rid of the query when the argument is empty but notNone
. (#845)
This is the first release that started shipping wheels for Python 3.11.
- Added
URL.raw_suffix
,URL.suffix
,URL.raw_suffixes
,URL.suffixes
,URL.with_suffix
. (#613)
- Fixed broken internal references to
~yarl.URL.human_repr
. (#665) - Fixed broken external references to
multidict:index
docs. (#665)
- Dropped Python 3.6 support. (#672)
- Changed call in
with_port()
to stop reencoding parts of the URL that were already encoded. (#623)
- Fix 1.7.0 build error
- Add
__bytes__()
magic method so thatbytes(url)
will work and use optimal ASCII encoding. (#582) - Started shipping platform-specific arm64 wheels for Apple Silicon. (#622)
- Started shipping platform-specific wheels with the
musl
tag targeting typical Alpine Linux runtimes. (#622) - Added support for Python 3.10. (#622)
- No longer loose characters when decoding incorrect percent-sequences (like
%e2%82%f8
). All non-decodable percent-sequences are now preserved. #517 - Provide x86 Windows wheels. #535
- Provide generated
.c
files in TarBall distribution. #530
- Provide wheels for
aarch64
,i686
,ppc64le
,s390x
architectures on Linux as well asx86_64
. #507 - Provide wheels for Python 3.9. #526
human_repr()
now always produces valid representation equivalent to the original URL (if the original URL is valid). #511- Fixed requoting a single percent followed by a percent-encoded character in the Cython implementation. #514
- Fix ValueError when decoding
%
which is not followed by two hexadecimal digits. #516 - Fix decoding
%
followed by a space and hexadecimal digit. #520 - Fix annotation of
with_query()
/update_query()
methods forkey=[val1, val2]
case. #528
- Drop Python 3.5 support; Python 3.6 is the minimal supported Python version.
- Allow for int and float subclasses in query, while still denying bool. #492
- Do not requote arguments in
URL.build()
,with_xxx()
and in/
operator. #502 - Keep IPv6 brackets in
origin()
. #504
- Fix including relocated internal
yarl._quoting_c
C-extension into published PyPI dists. #485
- Convert host to lowercase on URL building. #386
- Allow using
mod
operator (%
) for updating query string (an alias forupdate_query()
method). #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")
- Support
URL.build()
with scheme and path (creates a relative URL). #464 - Cache slow IDNA encode/decode calls. #476
- Add
@final
/Final
type hints #477 - Support URL authority/raw_authority properties and authority argument of
URL.build()
method. #478 - Hide the library implementation details, make the exposed public list very clean. #483
- Fix tests with newer Python (3.7.6, 3.8.1 and 3.9.0+). #409
- Fix a bug where query component, passed in a form of mapping or sequence, is unquoted in unexpected way. #426
- Hide
Query
andQueryVariable
type aliases in__init__.pyi
, now they are prefixed with underscore. #431 - Keep IPv6 brackets after updating port/user/password. #451
- Workaround for missing
str.isascii()
in Python 3.6 #389
- Fix regression, make the library work on Python 3.5 and 3.6 again.
- 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)
- 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)
- Drop Python 3.4 trove classifier (#205)
- Fix annotations for
build
(#199)
- Fix annotations for
cached_property
(#195)
- Accept
str
subclasses inURL
constructor (#190)
- Fix build
- Pin minimal required Python to 3.5.3 (#189)
- Forbid inheritance, replace
__init__
with__new__
(#171) - Support PEP-561 (provide type hinting marker) (#182)
- Fix performance regression: don't encode empty
netloc
(#170)
- Make pure Python quoter consistent with Cython version (#162)
- 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)
- Fallback to IDNA 2003 if domain name is not IDNA 2008 compatible (#152)
- Use IDNA 2008 for domain name processing (#149)
- Fix raising
TypeError
byurl.query_string()
afterurl.with_query({})
(empty mapping) (#141)
- Add
raw_path_qs
attribute (#137)
- Restore
strict
parameter as no-op inquote
/unquote
- Restore
strict
parameter as no-op for sake of compatibility with aiohttp 2.2
- Drop strict mode (#123)
- Fix
"ValueError: Unallowed PCT %"
when there's a"%"
in the URL (#124)
- 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)
- Properly support paths without leading slash in
URL.with_path()
(#90) - Enable type annotation checks
- Normalize path (#86)
- Clear query and fragment parts in
.with_path()
(#85)
- Prevent double URL arguments unquoting (#83)
- Unexpected hash behavior (#75)
- Unexpected compare behavior (#73)
- Do not quote or unquote + if not a query string. (#74)
- Added
URL.build
class method (#58) - Added
path_qs
attribute (#42)
- Do not quote
:
in path
- Load from pickle without _cache (#56)
- Percent-encoded pluses in path variables become spaces (#59)
- Revert backward incompatible change (BaseURL)
- Fix BaseURL rich comparison support
- Use BaseURL
- Added BaseURL
- Remove debug print
- Do not lose tail chars (#45)
- 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)
- Fix broken aiohttp: revert back
quote
/unquote
.
- 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
- Accept not only
str
but all classes inherited fromstr
also (#25)
- Accept
int
as value for.with_query()
- Explicitly use UTF8 encoding in
setup.py
(#20) - Properly unquote non-UTF8 strings (#19)
- Don't use :py
typing.NamedTuple
fields but indexes on URL construction
- Inline
_encode
class method
- Make URL construction faster by removing extra classmethod calls
- Add Cython optimization for quoting/unquoting
- Provide binary wheels
- Fix typing stubs
- Expose
quote()
andunquote()
as public API
- Support empty values in query (
'/path?arg'
)
- Introduce
relative()
(#16)
- Typo fixes #15
- Support sequence of pairs as
with_query()
parameter
- Introduce
is_default_port()
- Raise ValueError for URLs like 'http://:8080/'
- Avoid doubling slashes when joining paths (#13)
- Appending path starting from slash is forbidden (#12)
- Add
kwargs
support forwith_query()
(#10)
- Document
with_query()
,with_fragment()
andorigin()
- Allow
None
forwith_query()
andwith_fragment()
- Fix links, tune docs theme.
- Update README, old version used obsolete API
- The library was deeply refactored, bytes are gone away but all accepted strings are encoded if needed.
- The first release.