pypi yarl 1.9.5

latest releases: 1.11.1, 1.11.0, 1.10.0...
19 days ago

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 (/) in URL.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 the Towncrier 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 of pyproject-rpm-macros <https://src.fedoraproject.org/rpms/pyproject-rpm-macros>__. It was
    only reproducible with pip wheel and was not affecting the
    pyproject-build users.

    -- by :user:hroncok and :user:webknjaz

    Related issues and pull requests on GitHub:
    #992, #1014.

  • 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, and raw_host are now cached_property -- by :user:bdraco.

    aiohttp accesses these properties quite often, which cause :mod:urllib to build the _hostinfo property every time. port, scheme, and raw_host are now cached properties, which will improve performance.

    Related issues and pull requests on GitHub:
    #1044, #1058.


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 the port 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 just pure-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.

    #961

  • 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.

    #962

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 the encoding 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 a config_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 force pypa/build produce a wheel from source
    directly, as opposed to building an sdist 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 just pure-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__> return NotImplemented 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 the host 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 not None. (#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 that bytes(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 as x86_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 for key=[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 for update_query() method).
    #435 <https://github.com/aio-libs/yarl/issues/435>_

  • Allow use of sequences such as list and tuple in the values
    of a mapping such as dict 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 and QueryVariable 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 of URL.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 returns False (#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 in URL 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 and yarl.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 in yarl.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 by url.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 in quote / 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)

  • Drop strict mode (#123)

  • Fix "ValueError: Unallowed PCT %" when there's a "%" in the URL (#124)

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)

  • Normalize path (#86)

  • Clear query and fragment parts in .with_path() (#85)

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)

  • Unexpected compare behavior (#73)

  • Do not quote or unquote + if not a query string. (#74)

0.10.0 (2017-03-14)

  • Added URL.build class method (#58)

  • Added path_qs attribute (#42)

0.9.8 (2017-02-16)

  • Do not quote : in path

0.9.7 (2017-02-16)

  • Load from pickle without _cache (#56)

  • Percent-encoded pluses in path variables become spaces (#59)

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 and yarl.unquote, these functions are
    part of private API

0.7.1 (2016-11-18)

  • Accept not only str but all classes inherited from str also (#25)

0.7.0 (2016-11-07)

  • Accept int as value for .with_query()

0.6.0 (2016-11-07)

  • Explicitly use UTF8 encoding in :file:setup.py (#20)
  • Properly unquote non-UTF8 strings (#19)

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() and unquote() 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 for with_query() (#10)

0.1.3 (2016-09-07)

  • Document with_query(), with_fragment() and origin()

  • Allow None for with_query() and with_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.

Don't miss a new yarl release

NewReleases is sending notifications on new releases.