Changelog

To be included in v1.8.1.dev0 (if present)

v1.8.1.dev0 [UNRELEASED DRAFT]

(2026-06-03)

Bug fixes

  • Fixed copy.copy() producing a broken shallow copy that shared the internal items list with the original FrozenList, causing mutations to one to affect the other – by @veeceey.

    Related issues and pull requests on GitHub: #743.

Removals and backward incompatible breaking changes

  • Dropped support for Python 3.9; Python 3.10 is now the minimum supported version – by @bdraco.

    Related issues and pull requests on GitHub: #765, #766.

  • Dropped support for the experimental free-threaded build of CPython 3.13 – by @bdraco.

    Related issues and pull requests on GitHub: #775, #776.

Packaging updates and notes for downstreams

  • Moved core packaging metadata from setup.cfg to pyproject.toml per PEP 621 – by @cdce8p.

    Related issues and pull requests on GitHub: #644.

  • Added support for building and shipping riscv64 wheels – by @justeph and @gounthar.

    Related issues and pull requests on GitHub: #741, #744, #745.

Contributor-facing changes

  • The pull request template to be consistent with the contributing guidelines, particularly the list of categories – by @musicinmybrain.

    Related issues and pull requests on GitHub: #650.

  • The type preciseness coverage report generated by MyPy is now uploaded to Coveralls and will not be included in the Codecov views going forward – by @webknjaz.

    Related issues and pull requests on GitHub: #756.

  • Added an AGENTS.md file at the repository root with orientation and pull request rules for LLM-based contributors, adapted from the yarl equivalent – by @bdraco.

    Related issues and pull requests on GitHub: #757.

  • Documented in AGENTS.md that the coverage gate also applies to test code, so unreachable defensive raise guards and one-sided cleanup branches in tests will fail CI – by @bdraco.

    Related issues and pull requests on GitHub: #760.

  • Added a CLAUDE.md at the repository root that imports AGENTS.md via Claude Code’s @-syntax, so the project’s LLM contributor rules load automatically when working in Claude Code – by @bdraco.

    Related issues and pull requests on GitHub: #761.

  • Migrated from standalone black and isort pre-commit hooks to ruff format and the ruff I lint rule, sharing a new [tool.ruff] config in pyproject.toml. The ruff-check hook runs with --fix so import-order fixes apply on commit, and the orphan [isort] block in setup.cfg was removed – by @bdraco.

    Related issues and pull requests on GitHub: #762.

  • Pinned the coverage.py core to ctrace via the COVERAGE_CORE environment variable in the CI workflow so that the Cython.Coverage plugin keeps working on Python 3.14, where coverage.py otherwise defaults to the sysmon core that does not support plugin file tracers – by @bdraco.

    Related issues and pull requests on GitHub: #763.

  • Switched the cibuildwheel build frontend to build[uv] so that uv provisions every build and test virtual environment in the wheel matrix. Test-dependency installation in particular drops from a multi-second pip install per ABI to a roughly sub-second uv resolve – by @bdraco.

    Related issues and pull requests on GitHub: #764.

  • Enabled the UP (pyupgrade) rule set in the ruff lint configuration and upgraded the existing type annotations to use PEP 585 builtin generics and PEP 604 union syntax, now that the minimum supported Python version is 3.10 – by @bdraco.

    Related issues and pull requests on GitHub: #769, #770.

  • Overrode CIBW_BUILD_FRONTEND=build for the odd-arches wheel matrix so the jobs do not fail on the pypa containers that lack a preinstalled uv – by @bdraco.

    Related issues and pull requests on GitHub: #771.

  • Allowed re-running the deploy job after a partial release failure: the Make Release step now skips when the GitHub Release already exists, and the PyPI publish step uses skip-existing so dists that were already uploaded on a prior attempt do not break the retry – by @bdraco.

    Related issues and pull requests on GitHub: #773.

  • Switched the aarch64 and armv7l wheel builds to GitHub’s native ARM runners. The aarch64 wheels now build without QEMU emulation, and armv7l runs on aarch64 hosts so its 32-bit ARM execution is far cheaper than the previous aarch64-on-x86_64 path – by @bdraco.

    Related issues and pull requests on GitHub: #774.

  • Added tests that re-import frozenlist with FROZENLIST_NO_EXTENSIONS set and unset, so every Codecov upload exercises both directions of the import-time if not NO_EXTENSIONS: branch in frozenlist/__init__.py and the codecov/project/lib gate no longer treats it as a one-sided partial – by @bdraco.

    Related issues and pull requests on GitHub: #782.

  • Added UV_CONSTRAINT and UV_BUILD_CONSTRAINT alongside PIP_CONSTRAINT and PIP_BUILD_CONSTRAINT in the cibuildwheel environment so the requirements/cython.txt pin is honored under the build[uv] frontend; uv pip ignores the PIP_ variables and reads only the UV_ ones, while the PIP_ variants are kept for the pip fallback path – by @bdraco.

    Related issues and pull requests on GitHub: #783.


Released versions

v1.8.0

(2025-10-05)

Contributor-facing changes

  • The reusable-cibuildwheel.yml workflow has been refactored to be more generic and ci-cd.yml now holds all the configuration toggles – by @webknjaz.

    Related issues and pull requests on GitHub: #668.

  • When building wheels, the source distribution is now passed directly to the cibuildwheel invocation – by @webknjaz.

    Related issues and pull requests on GitHub: #669.

  • Builds and tests have been added to ci-cd.yml for arm64 Windows wheels – by @finnagin.

    Related issues and pull requests on GitHub: #677.

  • Started building wheels for CPython 3.14 – by @kumaraditya303.

    Related issues and pull requests on GitHub: #681, #682.

  • Removed --config-settings=pure-python=false from requirements/dev.txt. Developers on CPython still get accelerated builds by default. To explicitly build a pure Python wheel, use pip install -e . --config-settings=pure-python=true – by @bdraco.

    Related issues and pull requests on GitHub: #687.


v1.7.0

(2025-06-09)

Features

  • Added deepcopy support to FrozenList – by @bdraco.

    Related issues and pull requests on GitHub: #659.

Packaging updates and notes for downstreams

  • Fixed an issue where frozenlist binary wheels would be built with debugging symbols and line tracing enabled, which significantly impacted performance. Line tracing is now disabled by default and can only be enabled explicitly – by @bdraco.

    This change ensures that production builds are optimized for performance. Developers who need line tracing for debugging purposes can still enable it by:

    1. Setting the FROZENLIST_CYTHON_TRACING environment variable

    2. Using the --config-setting=with-cython-tracing=true option with pip

    Related issues and pull requests on GitHub: #660.

  • Enabled PIP_CONSTRAINT environment variable in the build configuration to ensure the pinned Cython version from requirements/cython.txt is used during wheel builds.

    Related issues and pull requests on GitHub: #661.


v1.6.2

(2025-06-03)

No significant changes.


v1.6.1

(2025-06-02)

Bug fixes

  • Correctly use cimport for including PyBool_FromLong – by @lysnikolaou.

    Related issues and pull requests on GitHub: #653.

Packaging updates and notes for downstreams

  • Exclude _frozenlist.cpp from bdists/wheels – by @musicinmybrain.

    Related issues and pull requests on GitHub: #649.

  • Updated to use Cython 3.1 universally across the build path – by @lysnikolaou.

    Related issues and pull requests on GitHub: #654.


v1.6.0

(2025-04-17)

Bug fixes

  • Stopped implicitly allowing the use of Cython pre-release versions when building the distribution package – by @ajsanchezsanz and @markgreene74.

    Related commits on GitHub: 41591f2.

Features

  • Implemented support for the free-threaded build of CPython 3.13 – by @lysnikolaou.

    Related issues and pull requests on GitHub: #618.

  • Started building armv7l wheels – by @bdraco.

    Related issues and pull requests on GitHub: #642.

Packaging updates and notes for downstreams

  • Stopped implicitly allowing the use of Cython pre-release versions when building the distribution package – by @ajsanchezsanz and @markgreene74.

    Related commits on GitHub: 41591f2.

  • Started building wheels for the free-threaded build of CPython 3.13 – by @lysnikolaou.

    Related issues and pull requests on GitHub: #618.

  • The packaging metadata switched to including an SPDX license identifier introduced in PEP 639 – by @cdce8p.

    Related issues and pull requests on GitHub: #639.

Contributor-facing changes

  • GitHub Actions CI/CD is now configured to manage caching pip-ecosystem dependencies using re-actors/cache-python-deps – an action by @webknjaz that takes into account ABI stability and the exact version of Python runtime.

    Related issues and pull requests on GitHub: #633.

  • Organized dependencies into test and lint dependencies so that no unnecessary ones are installed during CI runs – by @lysnikolaou.

    Related issues and pull requests on GitHub: #636.


1.5.0 (2024-10-22)

Bug fixes

  • An incorrect signature of the __class_getitem__ class method has been fixed, adding a missing class_item argument under Python 3.8 and older.

    This change also improves the code coverage of this method that was previously missing – by @webknjaz.

    Related issues and pull requests on GitHub: #567, #571.

Improved documentation

  • Rendered issue, PR, and commit links now lead to frozenlist’s repo instead of yarl’s repo.

    Related issues and pull requests on GitHub: #573.

  • On the Contributing docs page, a link to the Towncrier philosophy has been fixed.

    Related issues and pull requests on GitHub: #574.

Packaging updates and notes for downstreams

  • A name of a temporary building directory now reflects that it’s related to frozenlist, not yarl.

    Related issues and pull requests on GitHub: #573.

  • Declared Python 3.13 supported officially in the distribution package metadata.

    Related issues and pull requests on GitHub: #595.


1.4.1 (2023-12-15)

Packaging updates and notes for downstreams

  • Declared Python 3.12 and PyPy 3.8-3.10 supported officially in the distribution package metadata.

    Related issues and pull requests on GitHub: #553.

  • Replaced the packaging is replaced from an old-fashioned setup.py to an in-tree PEP 517 build backend – by @webknjaz.

    Whenever the end-users or downstream packagers need to build frozenlist 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:

    $ python3 -m pip install . --config-settings=pure-python=
    

    This will also work with -e | --editable.

    The same can be achieved via pypa/build:

    $ python3 -m build --config-setting=pure-python=
    

    Adding -w | --wheel can force pypa/build produce a wheel from source directly, as opposed to building an sdist and then building from it.

    Related issues and pull requests on GitHub: #560.

Contributor-facing changes

  • It is now possible to request line tracing in Cython builds using the with-cython-tracing PEP 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:

    $ python3 -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 FROZENLIST_CYTHON_TRACING=1 environment variable can be set to do the same as the PEP 517 config setting.

    Related issues and pull requests on GitHub: #560.

  • Coverage collection has been implemented for the Cython modules – by @webknjaz.

    It will also be reported to Codecov from any non-release CI jobs.

    Related issues and pull requests on GitHub: #561.

  • A step-by-step Release Guide guide has been added, describing how to release frozenlist – by @webknjaz.

    This is primarily targeting the maintainers.

    Related issues and pull requests on GitHub: #563.

  • Detailed Contributing Guidelines on authoring the changelog fragments have been published in the documentation – by @webknjaz.

    Related issues and pull requests on GitHub: #564.


1.4.0 (2023-07-12)

The published source distribution package became buildable under Python 3.12.


Bugfixes

Deprecations and Removals

  • Dropped Python 3.7 support. #413

Misc


1.3.3 (2022-11-08)

  • Fixed CI runs when creating a new release, where new towncrier versions fail when the current version section is already present.


1.3.2 (2022-11-08)

Misc

  • Updated the CI runs to better check for test results and to avoid deprecated syntax. #327


1.3.1 (2022-08-02)

The published source distribution package became buildable under Python 3.11.


1.3.0 (2022-01-18)

Bugfixes

  • Do not install C sources with binary distributions. #250

Deprecations and Removals

  • Dropped Python 3.6 support #274


1.2.0 (2021-10-16)

Features

  • FrozenList now supports being used as a generic type as per PEP 585, e.g. frozen_int_list: FrozenList[int] (requires Python 3.9 or newer). #172

  • Added support for Python 3.10. #227

  • Started shipping platform-specific wheels with the musl tag targeting typical Alpine Linux runtimes. #227

  • Started shipping platform-specific arm64 wheels for Apple Silicon. #227


1.1.1 (2020-11-14)

Bugfixes

  • Provide x86 Windows wheels. #169


1.1.0 (2020-10-13)

Features

  • Add support for hashing of a frozen list. #136

  • Support Python 3.8 and 3.9.

  • Provide wheels for aarch64, i686, ppc64le, s390x architectures on Linux as well as x86_64.


1.0.0 (2019-11-09)

Deprecations and Removals

  • Dropped support for Python 3.5; only 3.6, 3.7 and 3.8 are supported going forward. #24