From 9765493020e6292599e272978a25935dd4d0fa88 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 10 Nov 2021 07:39:07 -0500 Subject: [PATCH] fix: CPython 3.11 support. #1241 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 https://github.com/nedbat/coveragepy/issues/1278 The raise_through_with skip is noted in https://github.com/nedbat/coveragepy/issues/1270 --- .github/workflows/coverage.yml | 1 + .github/workflows/kit.yml | 13 +++++++++++-- .github/workflows/testsuite.yml | 1 + CHANGES.rst | 4 ++++ README.rst | 2 +- coverage/ctracer/util.h | 8 +++++++- doc/index.rst | 2 +- setup.py | 1 + tests/test_arcs.py | 2 ++ tests/test_process.py | 2 ++ tox.ini | 5 ++++- 11 files changed, 35 insertions(+), 6 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index cbfd44ec8..3e12f01be 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -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? diff --git a/.github/workflows/kit.yml b/.github/workflows/kit.yml index fc4548586..3aa67dde5 100644 --- a/.github/workflows/kit.yml +++ b/.github/workflows/kit.yml @@ -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: @@ -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: @@ -206,7 +215,7 @@ jobs: - windows - macos py: - - "3.10.0-rc.2" + - "3.11.0-alpha.2" fail-fast: false steps: diff --git a/.github/workflows/testsuite.yml b/.github/workflows/testsuite.yml index d42990740..6f31f48f7 100644 --- a/.github/workflows/testsuite.yml +++ b/.github/workflows/testsuite.yml @@ -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? diff --git a/CHANGES.rst b/CHANGES.rst index 015f7db8f..8855bcc6c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -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 `_. + - 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. @@ -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 diff --git a/README.rst b/README.rst index e34a2dced..777bbb989 100644 --- a/README.rst +++ b/README.rst @@ -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 diff --git a/coverage/ctracer/util.h b/coverage/ctracer/util.h index ff139329a..58fa1d490 100644 --- a/coverage/ctracer/util.h +++ b/coverage/ctracer/util.h @@ -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 +#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) diff --git a/doc/index.rst b/doc/index.rst index 37fe33ee1..6bc00750e 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -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. diff --git a/setup.py b/setup.py index 83553c922..b396a6dd6 100644 --- a/setup.py +++ b/setup.py @@ -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 diff --git a/tests/test_arcs.py b/tests/test_arcs.py index 6a65d4feb..349a560fc 100644 --- a/tests/test_arcs.py +++ b/tests/test_arcs.py @@ -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" diff --git a/tests/test_process.py b/tests/test_process.py index 1e6448648..83ca1febe 100644 --- a/tests/test_process.py +++ b/tests/test_process.py @@ -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 diff --git a/tox.ini b/tox.ini index 3f39965d2..31162ac73 100644 --- a/tox.ini +++ b/tox.ini @@ -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} @@ -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 @@ -95,4 +97,5 @@ python = 3.8: py38 3.9: py39 3.10: py310 + 3.11: py311 pypy3: pypy3