Skip to content

Commit

Permalink
fix: CPython 3.11 support. #1241
Browse files Browse the repository at this point in the history
The fix for CTracer is egregious and will need to be updated when there's a
supported way to do it.

The fullcoverage skip is noted in
#1278

The raise_through_with skip is noted in
#1270
  • Loading branch information
nedbat committed Nov 10, 2021
1 parent dfa9774 commit 9765493
Show file tree
Hide file tree
Showing 11 changed files with 35 additions and 6 deletions.
1 change: 1 addition & 0 deletions .github/workflows/coverage.yml
Expand Up @@ -38,6 +38,7 @@ jobs:
- "3.8"
- "3.9"
- "3.10"
- "3.11.0-alpha.2"
- "pypy3"
exclude:
# Windows PyPy doesn't seem to work?
Expand Down
13 changes: 11 additions & 2 deletions .github/workflows/kit.yml
Expand Up @@ -4,6 +4,15 @@
# Based on:
# https://github.com/joerick/cibuildwheel/blob/master/examples/github-deploy.yml

# To test installing wheels without uploading them to PyPI:
#
# $ mkdir /tmp/pypi
# $ cp dist/* /tmp/pypi
# $ python -m pip install piprepo
# $ piprepo build /tmp/pypi
# $ python -m pip install -v coverage --index-url=file:///tmp/pypi/simple
#

name: "Kits"

on:
Expand Down Expand Up @@ -197,7 +206,7 @@ jobs:

prerel:
name: "Build pre-rel ${{ matrix.os }} ${{ matrix.py }} wheels"
if: ${{ false }} # disable for now, since there are no pre-rel Python versions.
if: ${{ true }} # true when there are pre-rel, false when not.
runs-on: "${{ matrix.os }}-latest"
strategy:
matrix:
Expand All @@ -206,7 +215,7 @@ jobs:
- windows
- macos
py:
- "3.10.0-rc.2"
- "3.11.0-alpha.2"
fail-fast: false

steps:
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/testsuite.yml
Expand Up @@ -37,6 +37,7 @@ jobs:
- "3.8"
- "3.9"
- "3.10"
- "3.11.0-alpha.2"
- "pypy3"
exclude:
# Windows PyPy doesn't seem to work?
Expand Down
4 changes: 4 additions & 0 deletions CHANGES.rst
Expand Up @@ -22,6 +22,9 @@ This list is detailed and covers changes in each pre-release version.
Unreleased
----------

- Python 3.11 is supported (tested with 3.11.0a2). One still-open issue has to
do with `exits through with-statements <issue 1270_>`_.

- Fix: When remapping file paths through the ``[paths]`` setting while
combining, the ``[run] relative_files`` setting was ignored, resulting in
absolute paths for remapped file names (`issue 1147`_). This is now fixed.
Expand All @@ -44,6 +47,7 @@ Unreleased

.. _django_coverage_plugin issue 78: https://github.com/nedbat/django_coverage_plugin/issues/78
.. _issue 1147: https://github.com/nedbat/coveragepy/issues/1147
.. _issue 1270: https://github.com/nedbat/coveragepy/issues/1270
.. _issue 1271: https://github.com/nedbat/coveragepy/issues/1271
.. _issue 1273: https://github.com/nedbat/coveragepy/issues/1273

Expand Down
2 changes: 1 addition & 1 deletion README.rst
Expand Up @@ -19,7 +19,7 @@ library to determine which lines are executable, and which have been executed.

Coverage.py runs on these versions of Python:

* CPython 3.6 through 3.10.
* CPython 3.6 through 3.11.
* PyPy3 7.3.7.

Documentation is on `Read the Docs`_. Code repository and issue tracker are on
Expand Down
8 changes: 7 additions & 1 deletion coverage/ctracer/util.h
Expand Up @@ -12,9 +12,15 @@
#undef COLLECT_STATS /* Collect counters: stats are printed when tracer is stopped. */
#undef DO_NOTHING /* Define this to make the tracer do nothing. */

#if PY_VERSION_HEX >= 0x030B00A0
// 3.11 moved f_lasti into an internal structure. This is totally the wrong way
// to make this work, but it's all I've got until https://bugs.python.org/issue40421
// is resolved.
#include <internal/pycore_frame.h>
#define MyFrame_lasti(f) ((f)->f_frame->f_lasti * 2)
#elif PY_VERSION_HEX >= 0x030A00A7
// The f_lasti field changed meaning in 3.10.0a7. It had been bytes, but
// now is instructions, so we need to adjust it to use it as a byte index.
#if PY_VERSION_HEX >= 0x030A00A7
#define MyFrame_lasti(f) ((f)->f_lasti * 2)
#else
#define MyFrame_lasti(f) ((f)->f_lasti)
Expand Down
2 changes: 1 addition & 1 deletion doc/index.rst
Expand Up @@ -16,7 +16,7 @@ not.
The latest version is coverage.py |release|, released |release_date|. It is
supported on:

* Python versions 3.6 through 3.10.
* Python versions 3.6 through 3.11.

* PyPy3 7.3.7.

Expand Down
1 change: 1 addition & 0 deletions setup.py
Expand Up @@ -44,6 +44,7 @@ def better_set_verbosity(v):
Programming Language :: Python :: 3.8
Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10
Programming Language :: Python :: 3.11
Programming Language :: Python :: Implementation :: CPython
Programming Language :: Python :: Implementation :: PyPy
Topic :: Software Development :: Quality Assurance
Expand Down
2 changes: 2 additions & 0 deletions tests/test_arcs.py
Expand Up @@ -279,6 +279,8 @@ def test_continue_through_with(self):
arcz=arcz,
)

@pytest.mark.skipif(env.PYVERSION[:2] >= (3, 11), reason="avoid a 3.11 bug: 45709")
# https://github.com/nedbat/coveragepy/issues/1270
def test_raise_through_with(self):
if env.PYBEHAVIOR.exit_through_with:
arcz = ".1 12 27 78 8. 9A A. -23 34 45 53 6-2"
Expand Down
2 changes: 2 additions & 0 deletions tests/test_process.py
Expand Up @@ -748,6 +748,8 @@ def f():
@pytest.mark.expensive
@pytest.mark.skipif(env.METACOV, reason="Can't test fullcoverage when measuring ourselves")
@pytest.mark.skipif(not env.C_TRACER, reason="fullcoverage only works with the C tracer.")
@pytest.mark.skipif(env.PYVERSION[:2] >= (3, 11), reason="this test needs work on 3.11")
# https://github.com/nedbat/coveragepy/issues/1278
def test_fullcoverage(self):
# fullcoverage is a trick to get stdlib modules measured from
# the very beginning of the process. Here we import os and
Expand Down
5 changes: 4 additions & 1 deletion tox.ini
Expand Up @@ -3,7 +3,7 @@

[tox]
# When changing this list, be sure to check the [gh-actions] list below.
envlist = py{36,37,38,39,310}, pypy3, doc, lint
envlist = py{36,37,38,39,310,311}, pypy3, doc, lint
skip_missing_interpreters = {env:COVERAGE_SKIP_MISSING_INTERPRETERS:True}
toxworkdir = {env:TOXWORKDIR:.tox}

Expand Down Expand Up @@ -32,6 +32,8 @@ setenv =
# For some tests, we need .pyc files written in the current directory,
# so override any local setting.
PYTHONPYCACHEPREFIX=
# PyContracts can't do 3.11.
py311: COVERAGE_NO_CONTRACTS=1

commands =
# Create tests/zipmods.zip
Expand Down Expand Up @@ -95,4 +97,5 @@ python =
3.8: py38
3.9: py39
3.10: py310
3.11: py311
pypy3: pypy3

0 comments on commit 9765493

Please sign in to comment.