<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xml:lang="en-US">
  <id>tag:github.com,2008:https://github.com/coveragepy/coveragepy/releases</id>
  <link type="text/html" rel="alternate" href="https://github.com/coveragepy/coveragepy/releases"/>
  <link type="application/atom+xml" rel="self" href="https://github.com/coveragepy/coveragepy/releases.atom"/>
  <title>Release notes from coveragepy</title>
  <updated>2026-09-27T12:31:50Z</updated>
  <entry>
    <id>tag:github.com,2008:Repository/138421996/7.16.2</id>
    <updated>2026-09-27T12:32:09Z</updated>
    <link rel="alternate" type="text/html" href="https://github.com/coveragepy/coveragepy/releases/tag/7.16.2"/>
    <title>7.16.2</title>
    <content type="html">&lt;h2&gt;Version 7.16.2 — 2026-09-27&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fix: on Python 3.14 and later, a &lt;code&gt;for&lt;/code&gt; loop completing immediately before a function return could mistakenly report an uncovered branch. This is now fixed, closing &lt;a href=&quot;https://github.com/coveragepy/coveragepy/issues/2168&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/issues/2168/hovercard&quot;&gt;issue 2168&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fix: on Python 3.14 and later, the &lt;code&gt;else&lt;/code&gt; clause of a &lt;code&gt;try&lt;/code&gt; whose body is a &lt;code&gt;with&lt;/code&gt; statement could incorrectly be reported as covered when the &lt;code&gt;with&lt;/code&gt; raised. This is now fixed, closing &lt;a href=&quot;https://github.com/coveragepy/coveragepy/issues/2289&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/issues/2289/hovercard&quot;&gt;issue 2289&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fix: with &lt;code&gt;dynamic_context = test_function&lt;/code&gt;, test methods written as &lt;code&gt;@staticmethod&lt;/code&gt; or &lt;code&gt;@classmethod&lt;/code&gt; were not given a context of their own. Now they are, on Python 3.11 and later. Closes &lt;a href=&quot;https://github.com/coveragepy/coveragepy/issues/1923&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/issues/1923/hovercard&quot;&gt;issue 1923&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;➡️  PyPI page: &lt;a href=&quot;https://pypi.org/project/coverage/7.16.2&quot; rel=&quot;nofollow&quot;&gt;coverage 7.16.2&lt;/a&gt;.&lt;br&gt;
➡️  To install: &lt;code&gt;python3 -m pip install coverage==7.16.2&lt;/code&gt;&lt;/p&gt;</content>
    <author>
      <name>nedbat</name>
    </author>
    <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/23789?s=60&amp;v=4"/>
  </entry>
  <entry>
    <id>tag:github.com,2008:Repository/138421996/7.16.1</id>
    <updated>2026-09-13T19:13:18Z</updated>
    <link rel="alternate" type="text/html" href="https://github.com/coveragepy/coveragepy/releases/tag/7.16.1"/>
    <title>7.16.1</title>
    <content type="html">&lt;h2&gt;Version 7.16.1 — 2026-09-13&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fix: when the body of an irrefutable &lt;code&gt;case&lt;/code&gt; (like &lt;code&gt;case _:&lt;/code&gt;) is entirely excluded, the &lt;code&gt;case&lt;/code&gt; line is now excluded too, just as an excluded &lt;code&gt;else:&lt;/code&gt; body removes the &lt;code&gt;else:&lt;/code&gt; line. Previously the &lt;code&gt;case&lt;/code&gt; line was left behind and reported as missing. Closes &lt;a href=&quot;https://github.com/coveragepy/coveragepy/issues/1563&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/issues/1563/hovercard&quot;&gt;issue 1563&lt;/a&gt; with &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2269&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2269/hovercard&quot;&gt;pull 2269&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fix: using &lt;a href=&quot;https://coverage.readthedocs.io/en/latest/api_coveragedata.html#coverage.CoverageData.update&quot; rel=&quot;nofollow&quot;&gt;CoverageData.update()&lt;/a&gt; twice on an in-memory database would fail, as described in &lt;a href=&quot;https://github.com/coveragepy/coveragepy/issues/2279&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/issues/2279/hovercard&quot;&gt;issue 2279&lt;/a&gt;. This is now fixed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;➡️  PyPI page: &lt;a href=&quot;https://pypi.org/project/coverage/7.16.1&quot; rel=&quot;nofollow&quot;&gt;coverage 7.16.1&lt;/a&gt;.&lt;br&gt;
➡️  To install: &lt;code&gt;python3 -m pip install coverage==7.16.1&lt;/code&gt;&lt;/p&gt;</content>
    <author>
      <name>nedbat</name>
    </author>
    <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/23789?s=60&amp;v=4"/>
  </entry>
  <entry>
    <id>tag:github.com,2008:Repository/138421996/7.16.0</id>
    <updated>2026-08-28T21:56:06Z</updated>
    <link rel="alternate" type="text/html" href="https://github.com/coveragepy/coveragepy/releases/tag/7.16.0"/>
    <title>7.16.0</title>
    <content type="html">&lt;h2&gt;Version 7.16.0 — 2026-08-28&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;When combining files, now path separator slashes will automatically be converted to the local file system style. This makes it less necessary to define &lt;code&gt;[paths]&lt;/code&gt; configuration to combine data across operating systems. Fixes &lt;a href=&quot;https://github.com/coveragepy/coveragepy/issues/2266&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/issues/2266/hovercard&quot;&gt;issue 2266&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://coverage.readthedocs.io/en/latest/api_coverage.html#coverage.Coverage.switch_context&quot; rel=&quot;nofollow&quot;&gt;Coverage.switch_context()&lt;/a&gt; method now returns the previous context.&lt;/li&gt;
&lt;li&gt;Fix: previously, a &lt;code&gt;[paths]&lt;/code&gt; pattern would be replaced everywhere in a file path when it was only meant to be replaced once, in the leading portion of the path. This is now fixed, in &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2268&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2268/hovercard&quot;&gt;pull 2268&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fixes to validation of options and configuration settings:
&lt;ul&gt;
&lt;li&gt;Negative precision settings now always cause useful error messages (&lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2261&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2261/hovercard&quot;&gt;pull 2261&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;An invalid regex in the &lt;code&gt;--contexts&lt;/code&gt; option (or the &lt;code&gt;[report] contexts&lt;/code&gt; setting) reported a confusing “Couldn’t use data file …: user-defined function raised exception” error. Now it raises a proper configuration error naming the bad regex, like other regex settings do (&lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2262&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2262/hovercard&quot;&gt;pull 2262&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Non-string values in TOML configuration settings now produce a helpful error message instead of a traceback. This affects list settings whose elements aren’t strings (like &lt;code&gt;omit&lt;/code&gt;, &lt;code&gt;exclude_lines&lt;/code&gt;, or a &lt;code&gt;[paths]&lt;/code&gt; entry), file settings like &lt;code&gt;data_file&lt;/code&gt;, and any wrong-typed value in the &lt;code&gt;[paths]&lt;/code&gt; section (&lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2263&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2263/hovercard&quot;&gt;pull 2263&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;coverage run&lt;/code&gt; refuses run-affecting command-line options like &lt;code&gt;--branch&lt;/code&gt; alongside &lt;code&gt;--concurrency=multiprocessing&lt;/code&gt;, since they can’t reach the subprocesses. The check only recognized &lt;code&gt;multiprocessing&lt;/code&gt; as the entire option value, so &lt;code&gt;--concurrency=multiprocessing,thread&lt;/code&gt; slipped through and failed later with “Can’t combine statement coverage data with branch data”. Each named concurrency library is now properly considered (&lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2270&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2270/hovercard&quot;&gt;pull 2270&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fix: &lt;code&gt;coverage annotate -d DIR&lt;/code&gt; raised an &lt;code&gt;AssertionError&lt;/code&gt; if any measured file had an extension other than &lt;code&gt;.py&lt;/code&gt;, such as a &lt;code&gt;.pyw&lt;/code&gt; file on Windows. The original extension is now restored on the annotated copy (&lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2265&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2265/hovercard&quot;&gt;pull 2265&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;➡️  PyPI page: &lt;a href=&quot;https://pypi.org/project/coverage/7.16.0&quot; rel=&quot;nofollow&quot;&gt;coverage 7.16.0&lt;/a&gt;.&lt;br&gt;
➡️  To install: &lt;code&gt;python3 -m pip install coverage==7.16.0&lt;/code&gt;&lt;/p&gt;</content>
    <author>
      <name>nedbat</name>
    </author>
    <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/23789?s=60&amp;v=4"/>
  </entry>
  <entry>
    <id>tag:github.com,2008:Repository/138421996/7.15.4</id>
    <updated>2026-08-06T15:06:03Z</updated>
    <link rel="alternate" type="text/html" href="https://github.com/coveragepy/coveragepy/releases/tag/7.15.4"/>
    <title>7.15.4</title>
    <content type="html">&lt;h2&gt;Version 7.15.4 — 2026-08-06&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fix: in the HTML report, a source file name containing a double quote (legal on POSIX) wasn’t escaped where it’s dropped into the &lt;code&gt;href&lt;/code&gt; of the index and prev/next links, so it could close the attribute early and inject markup. Page URLs are now escaped. Thanks, &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2227&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2227/hovercard&quot;&gt;Rajath Mohare&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fix: the LCOV report wrote file names and other fields into its line-oriented records without neutralizing control characters. A measured file whose name contained a newline (legal on POSIX) could forge extra records, inflating the coverage seen by tools that read the report. Control characters in a field are now replaced. Thanks, &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2226&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2226/hovercard&quot;&gt;Rajath Mohare&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Wheels are now provided for Python 3.15.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;➡️  PyPI page: &lt;a href=&quot;https://pypi.org/project/coverage/7.15.4&quot; rel=&quot;nofollow&quot;&gt;coverage 7.15.4&lt;/a&gt;.&lt;br&gt;
➡️  To install: &lt;code&gt;python3 -m pip install coverage==7.15.4&lt;/code&gt;&lt;/p&gt;</content>
    <author>
      <name>nedbat</name>
    </author>
    <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/23789?s=60&amp;v=4"/>
  </entry>
  <entry>
    <id>tag:github.com,2008:Repository/138421996/7.15.3</id>
    <updated>2026-08-02T18:54:00Z</updated>
    <link rel="alternate" type="text/html" href="https://github.com/coveragepy/coveragepy/releases/tag/7.15.3"/>
    <title>7.15.3</title>
    <content type="html">&lt;h2&gt;Version 7.15.3 — 2026-08-02&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fix: the sysmon core is incompatible with dynamic contexts. Previously, the combination would be prevented when read from the coverage.py configuration. But using the context API as pytest-cov does, contexts would be silently dropped. Now a warning is issued, thanks to &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2234&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2234/hovercard&quot;&gt;Jisang Han&lt;/a&gt;. Closes &lt;a href=&quot;https://github.com/coveragepy/coveragepy/issues/2200&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/issues/2200/hovercard&quot;&gt;issue 2200&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A performance improvement in the low-level line number bookkeeping when combining data files, thanks to &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2239&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2239/hovercard&quot;&gt;Kevin Turcios&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Performance improvement in HTML reporting by reducing the number of times files have to be parsed, thanks to &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2240&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2240/hovercard&quot;&gt;Kevin Turcios&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;➡️  PyPI page: &lt;a href=&quot;https://pypi.org/project/coverage/7.15.3&quot; rel=&quot;nofollow&quot;&gt;coverage 7.15.3&lt;/a&gt;.&lt;br&gt;
➡️  To install: &lt;code&gt;python3 -m pip install coverage==7.15.3&lt;/code&gt;&lt;/p&gt;</content>
    <author>
      <name>nedbat</name>
    </author>
    <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/23789?s=60&amp;v=4"/>
  </entry>
  <entry>
    <id>tag:github.com,2008:Repository/138421996/7.15.2</id>
    <updated>2026-07-15T18:57:26Z</updated>
    <link rel="alternate" type="text/html" href="https://github.com/coveragepy/coveragepy/releases/tag/7.15.2"/>
    <title>7.15.2</title>
    <content type="html">&lt;h2&gt;Version 7.15.2 — 2026-07-15&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fix: one of the performance improvements in 7.15.1 (pull 2215) dramatically increased memory use during reporting for large projects. Now we use a different approach that is both faster and slimmer than 7.15.0. Fixes &lt;a href=&quot;https://github.com/coveragepy/coveragepy/issues/2229&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/issues/2229/hovercard&quot;&gt;issue 2229&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;➡️  PyPI page: &lt;a href=&quot;https://pypi.org/project/coverage/7.15.2&quot; rel=&quot;nofollow&quot;&gt;coverage 7.15.2&lt;/a&gt;.&lt;br&gt;
➡️  To install: &lt;code&gt;python3 -m pip install coverage==7.15.2&lt;/code&gt;&lt;/p&gt;</content>
    <author>
      <name>nedbat</name>
    </author>
    <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/23789?s=60&amp;v=4"/>
  </entry>
  <entry>
    <id>tag:github.com,2008:Repository/138421996/7.15.1</id>
    <updated>2026-07-12T20:59:16Z</updated>
    <link rel="alternate" type="text/html" href="https://github.com/coveragepy/coveragepy/releases/tag/7.15.1"/>
    <title>7.15.1</title>
    <content type="html">&lt;h2&gt;Version 7.15.1 — 2026-07-12&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fix: in the HTML report with &lt;code&gt;show_contexts&lt;/code&gt; enabled, a context label containing &lt;code&gt;&amp;lt;/script&amp;gt;&lt;/code&gt; (for example a parametrized pytest node id) could close the inline &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; element in a file page early, injecting markup. Context labels are now fully escaped. Thanks, &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2224&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2224/hovercard&quot;&gt;Rajath Mohare&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A number of performance improvements thanks to Paul Kehrer, in pull requests &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2213&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2213/hovercard&quot;&gt;2213&lt;/a&gt;, &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2214&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2214/hovercard&quot;&gt;2214&lt;/a&gt;, &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2215&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2215/hovercard&quot;&gt;2215&lt;/a&gt;, &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2216&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2216/hovercard&quot;&gt;2216&lt;/a&gt;, &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2218&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2218/hovercard&quot;&gt;2218&lt;/a&gt;, &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2220&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2220/hovercard&quot;&gt;2220&lt;/a&gt;, and &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2221&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2221/hovercard&quot;&gt;2221&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;➡️  PyPI page: &lt;a href=&quot;https://pypi.org/project/coverage/7.15.1&quot; rel=&quot;nofollow&quot;&gt;coverage 7.15.1&lt;/a&gt;.&lt;br&gt;
➡️  To install: &lt;code&gt;python3 -m pip install coverage==7.15.1&lt;/code&gt;&lt;/p&gt;</content>
    <author>
      <name>nedbat</name>
    </author>
    <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/23789?s=60&amp;v=4"/>
  </entry>
  <entry>
    <id>tag:github.com,2008:Repository/138421996/7.15.0</id>
    <updated>2026-07-02T13:14:02Z</updated>
    <link rel="alternate" type="text/html" href="https://github.com/coveragepy/coveragepy/releases/tag/7.15.0"/>
    <title>7.15.0</title>
    <content type="html">&lt;h2&gt;Version 7.15.0 — 2026-07-02&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Since 7.14.0, reporting commands implicitly combine parallel data files. Now those commands have a new option &lt;code&gt;--keep-combined&lt;/code&gt; to retain the data files after combining them instead of the default, which is to delete them. Finishes &lt;a href=&quot;https://github.com/coveragepy/coveragepy/issues/2198&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/issues/2198/hovercard&quot;&gt;issue 2198&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fix: the LCOV report would incorrectly count excluded functions as uncovered, as described in &lt;a href=&quot;https://github.com/coveragepy/coveragepy/issues/2205&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/issues/2205/hovercard&quot;&gt;issue 2205&lt;/a&gt;. This is now fixed thanks to &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2206&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2206/hovercard&quot;&gt;Martin Kuntz Jacobsen&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;When running your program, coverage now correctly sets &lt;code&gt;yourmodule.__spec__.loader&lt;/code&gt; as &lt;a href=&quot;/coveragepy/coveragepy/blob/7.15.0&quot;&gt;strongly recommended&lt;/a&gt;, avoiding the deprecation warning described in &lt;a href=&quot;https://github.com/coveragepy/coveragepy/issues/2208&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/issues/2208/hovercard&quot;&gt;issue 2208&lt;/a&gt;. Thanks, &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2209&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2209/hovercard&quot;&gt;A5rocks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fix: with Python 3.10, running with the &lt;code&gt;-I&lt;/code&gt; (isolated mode) option didn’t correctly omit the current directory from the module search path, as described in &lt;a href=&quot;https://github.com/coveragepy/coveragepy/issues/2103&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/issues/2103/hovercard&quot;&gt;issue 2103&lt;/a&gt;. That is now fixed thanks to &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2211&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2211/hovercard&quot;&gt;Ilia Sorokin&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;➡️  PyPI page: &lt;a href=&quot;https://pypi.org/project/coverage/7.15.0&quot; rel=&quot;nofollow&quot;&gt;coverage 7.15.0&lt;/a&gt;.&lt;br&gt;
➡️  To install: &lt;code&gt;python3 -m pip install coverage==7.15.0&lt;/code&gt;&lt;/p&gt;</content>
    <author>
      <name>nedbat</name>
    </author>
    <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/23789?s=60&amp;v=4"/>
  </entry>
  <entry>
    <id>tag:github.com,2008:Repository/138421996/7.14.3</id>
    <updated>2026-06-22T23:12:00Z</updated>
    <link rel="alternate" type="text/html" href="https://github.com/coveragepy/coveragepy/releases/tag/7.14.3"/>
    <title>7.14.3</title>
    <content type="html">&lt;h2&gt;Version 7.14.3 — 2026-06-22&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fix: the default &lt;code&gt;...&lt;/code&gt; exclusion rule now also matches function bodies whose closing return-type bracket is on its own line (for example, after a long &lt;code&gt;-&amp;gt; dict[ ... ]&lt;/code&gt; annotation that a formatter has split over multiple lines). Closes &lt;a href=&quot;https://github.com/coveragepy/coveragepy/issues/2185&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/issues/2185/hovercard&quot;&gt;issue 2185&lt;/a&gt;, thanks &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2196&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2196/hovercard&quot;&gt;Mengjia Shang&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fix: On 3.13t, we incorrectly issued &lt;code&gt;Couldn&#39;t import C tracer&lt;/code&gt; errors. We can’t import the C tracer because in 7.14.2 we stopped shipping compiled wheels for 3.13t. Thanks, &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2203&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2203/hovercard&quot;&gt;Hugo van Kemenade&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;➡️  PyPI page: &lt;a href=&quot;https://pypi.org/project/coverage/7.14.3&quot; rel=&quot;nofollow&quot;&gt;coverage 7.14.3&lt;/a&gt;.&lt;br&gt;
➡️  To install: &lt;code&gt;python3 -m pip install coverage==7.14.3&lt;/code&gt;&lt;/p&gt;</content>
    <author>
      <name>nedbat</name>
    </author>
    <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/23789?s=60&amp;v=4"/>
  </entry>
  <entry>
    <id>tag:github.com,2008:Repository/138421996/7.14.2</id>
    <updated>2026-06-20T15:07:18Z</updated>
    <link rel="alternate" type="text/html" href="https://github.com/coveragepy/coveragepy/releases/tag/7.14.2"/>
    <title>7.14.2</title>
    <content type="html">&lt;h2&gt;Version 7.14.2 — 2026-06-20&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fix: some messages were being written to stdout, making &lt;code&gt;coverage json -o -&lt;/code&gt; useless for capturing JSON output. Now messages are written to stderr, fixing &lt;a href=&quot;https://github.com/coveragepy/coveragepy/issues/2197&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/issues/2197/hovercard&quot;&gt;issue 2197&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fix: &lt;code&gt;CoverageData&lt;/code&gt; kept 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 with &lt;code&gt;OSError: [Errno 24] Too many open files&lt;/code&gt;. Connections belonging to terminated threads are now closed and dropped. Fixes &lt;a href=&quot;https://github.com/coveragepy/coveragepy/issues/2192&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/issues/2192/hovercard&quot;&gt;issue 2192&lt;/a&gt;. Thanks, &lt;a href=&quot;https://github.com/coveragepy/coveragepy/pull/2193&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/pull/2193/hovercard&quot;&gt;Matthew Lloyd&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fix: when using sys.monitoring, we were assuming we could use the &lt;code&gt;COVERAGE_ID&lt;/code&gt; tool 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 &lt;a href=&quot;https://github.com/coveragepy/coveragepy/issues/2187&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/coveragepy/coveragepy/issues/2187/hovercard&quot;&gt;issue 2187&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Following &lt;a href=&quot;https://py-free-threading.github.io/ci/#building-free-threaded-wheels-with-cibuildwheel&quot; rel=&quot;nofollow&quot;&gt;the advice of cibuildwheel&lt;/a&gt;, we no longer distribute wheels for Python 3.13 free-threaded.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;➡️  PyPI page: &lt;a href=&quot;https://pypi.org/project/coverage/7.14.2&quot; rel=&quot;nofollow&quot;&gt;coverage 7.14.2&lt;/a&gt;.&lt;br&gt;
➡️  To install: &lt;code&gt;python3 -m pip install coverage==7.14.2&lt;/code&gt;&lt;/p&gt;</content>
    <author>
      <name>nedbat</name>
    </author>
    <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/23789?s=60&amp;v=4"/>
  </entry>
</feed>
