Releases: coveragepy/coveragepy
7.14.3
Version 7.14.3 — 2026-06-22
- Fix: the default
...exclusion rule now also matches function bodies whose closing return-type bracket is on its own line (for example, after a long-> dict[ ... ]annotation that a formatter has split over multiple lines). Closes issue 2185, thanks Mengjia Shang. - Fix: On 3.13t, we incorrectly issued
Couldn't import C tracererrors. We can’t import the C tracer because in 7.14.2 we stopped shipping compiled wheels for 3.13t. Thanks, Hugo van Kemenade.
➡️ PyPI page: coverage 7.14.3.
➡️ To install: python3 -m pip install coverage==7.14.3
7.14.2
Version 7.14.2 — 2026-06-20
- Fix: some messages were being written to stdout, making
coverage json -o -useless for capturing JSON output. Now messages are written to stderr, fixing issue 2197. - Fix:
CoverageDatakept one SQLite connection per thread that recorded coverage, but never closed them when those threads terminated. On long runs with many short-lived threads this leaked one file descriptor per dead thread, eventually failing withOSError: [Errno 24] Too many open files. Connections belonging to terminated threads are now closed and dropped. Fixes issue 2192. Thanks, Matthew Lloyd. - Fix: when using sys.monitoring, we were assuming we could use the
COVERAGE_IDtool id. But other tools might also assume they could use that id. Pre-allocated ids don’t really make sense, so now we search for a usable one instead. Fixes issue 2187. - Following the advice of cibuildwheel, we no longer distribute wheels for Python 3.13 free-threaded.
➡️ PyPI page: coverage 7.14.2.
➡️ To install: python3 -m pip install coverage==7.14.2
7.14.1
Version 7.14.1 — 2026-05-26
- Fix: the HTML report used typographic niceties to make file paths more readable by adding a small amount of space around slashes. Those spaces interfered with searching the page for file paths of interest. Now the report uses CSS to accomplish the same visual tweak so that searches with slashes work correctly. Closes issue 2170.
- Add a 3.16 PyPI classifier since we test on the 3.16 main branch.
➡️ PyPI page: coverage 7.14.1.
➡️ To install: python3 -m pip install coverage==7.14.1
7.14.0
Version 7.14.0 — 2026-05-10
- Feature: now when running one of the reporting commands, if there are parallel data files that need combining, they will be implicitly combined before creating the report. There is no option to avoid the combination; let us know if you have a use case that requires it. Thanks, Tim Hatch. Closes issue 1781.
- Fix: the output from
combinewas too verbose, listing each file considered. Now it shows a single line with the counts of files combined, files skipped, and files with errors. The-qflag suppresses this line. The old detailed lines are available with the new--debug=combineoption. - Fix: running a Python file through a symlink now sets the sys.path correctly, matching regular Python behavior. Fixes issue 2157.
- Fix:
Collector.flush_datacould fail with “RuntimeError: Set changed size during iteration” when a tracer in another thread added a line to the per-file set thatadd_lines(oradd_arcs) was iterating. The values passed toCoverageDataare now snapshotted viadict.copy()andset.copy(), which are atomic under the GIL. Thanks, Alex Vandiver. - Fix: the soft keyword
lazyis now bolded in HTML reports. - We are no longer testing eventlet support. Eventlet started issuing stern deprecation warnings that break our tests. Our support code is still there.
➡️ PyPI page: coverage 7.14.0.
➡️ To install: python3 -m pip install coverage==7.14.0
7.13.5
Version 7.13.5 — 2026-03-17
- Fix: issue 2138 describes a memory leak that happened when repeatedly using the Coverage API with in-memory data. This is now fixed.
- Fix: the markdown-formatted coverage report didn’t fully escape special characters in file paths (issue 2141). This would be very unlikely to cause a problem, but now it’s done properly, thanks to Ellie Ayla.
- Fix: the C extension wouldn’t build on VS2019, but now it does (issue 2145).
➡️ PyPI page: coverage 7.13.5.
➡️ To install: python3 -m pip install coverage==7.13.5
7.13.4
Version 7.13.4 — 2026-02-09
- Fix: the third-party code fix in 7.13.3 required examining the parent directories where coverage was run. In the unusual situation that one of the parent directories is unreadable, a PermissionError would occur, as described in issue 2129. This is now fixed.
- Fix: in test suites that change sys.path, coverage.py could fail with “RuntimeError: Set changed size during iteration” as described and fixed in pull 2130. Thanks, Noah Fatsi.
- We now publish ppc64le wheels, thanks to Pankhudi Jain.
➡️ PyPI page: coverage 7.13.4.
➡️ To install: python3 -m pip install coverage==7.13.4
7.13.3
Version 7.13.3 — 2026-02-03
- Fix: in some situations, third-party code was measured when it shouldn’t have been, slowing down test execution. This happened with layered virtual environments such as uv sometimes makes. The problem is fixed, closing issue 2082. Now any directory on sys.path that is inside a virtualenv is considered third-party code.
➡️ PyPI page: coverage 7.13.3.
➡️ To install: python3 -m pip install coverage==7.13.3
7.13.2
Version 7.13.2 — 2026-01-25
- Fix: when Python is installed via symlinks, for example with Homebrew, the standard library files could be incorrectly included in coverage reports. This is now fixed, closing issue 2115.
- Fix: if a data file is created with no read permissions, the combine step would fail completely. Now a warning is issued and the file is skipped. Closes issue 2117.
➡️ PyPI page: coverage 7.13.2.
➡️ To install: python3 -m pip install coverage==7.13.2
7.13.1
Version 7.13.1 — 2025-12-28
- Added: the JSON report now includes a
"start_line"key for function and class regions, indicating the first line of the region in the source. Closes issue 2110. - Added: The
debug datacommand now takes file names as arguments on the command line, so you can inspect specific data files without needing to set theCOVERAGE_FILEenvironment variable. - Fix: the JSON report used to report module docstrings as executed lines, which no other report did, as described in issue 2105. This is now fixed, thanks to Jianrong Zhao.
- Fix: coverage.py uses a more disciplined approach to detecting where third-party code is installed, and avoids measuring it. This shouldn’t change any behavior. If you find that it does, please get in touch.
- Performance: data files that will be combined now record their hash as part of the file name. This lets us skip duplicate data more quickly, speeding the combining step.
- Docs: added a section explaining more about what is considered a missing branch and how it is reported: Examples of missing branches, as requested in issue 1597. Thanks to Ayisha Mohammed.
- Tests: the test suite misunderstood what core was being tested if
COVERAGE_COREwasn’t set on 3.14+. This is now fixed, closing issue 2109.
➡️ PyPI page: coverage 7.13.1.
➡️ To install: python3 -m pip install coverage==7.13.1
7.13.0
Version 7.13.0 — 2025-12-08
- Feature: coverage.py now supports
.coveragerc.tomlconfiguration files. These files use TOML syntax and take priority overpyproject.tomlbut lower priority than.coveragercfiles. Closes issue 1643 thanks to Olena Yefymenko. - Fix: we now include a permanent .pth file which is installed with the code, fixing issue 2084. In 7.12.1b1 this was done incorrectly: it didn’t work when using the source wheel (
py3-none-any). This is now fixed. Thanks, Henry Schreiner. - Deprecated: when coverage.py is installed, it creates three command entry points:
coverage,coverage3, andcoverage-3.10(if installed for Python 3.10). The second and third of these are not needed and will eventually be removed. They still work for now, but print a message about their deprecation.
➡️ PyPI page: coverage 7.13.0.
➡️ To install: python3 -m pip install coverage==7.13.0