diff --git a/.github/ISSUE_TEMPLATE/support.md b/.github/ISSUE_TEMPLATE/support.md
new file mode 100644
index 000000000..d373ef5c6
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/support.md
@@ -0,0 +1,26 @@
+---
+name: Support request
+about: Ask for help using coverage.py
+title: ''
+labels: support, needs triage
+assignees: ''
+
+---
+
+**Have you asked elsewhere?**
+
+There are other good places to ask for help using coverage.py. These places let
+other people suggest solutions, are more likely places for people to find your
+question:
+
+- [Stack Overflow](https://stackoverflow.com/questions/tagged/coverage.py)
+- [discuss.python.org](https://discuss.python.org/search?q=coverage.py)
+
+**Describe your situation**
+
+Wherever you ask your question, be sure to explain:
+
+- What you did
+- What happened
+- How that was different than what you wanted to happen
+- What kind of help you need
diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml
index 5bd88afa1..5c9a8814f 100644
--- a/.github/workflows/coverage.yml
+++ b/.github/workflows/coverage.yml
@@ -55,10 +55,13 @@ jobs:
- "pypy-3.9"
- "pypy-3.10"
exclude:
- # Mac PyPy always takes the longest, and doesn't add anything. Skip
- # 3.8, but use 3.9/3.10 while Windows is still borked.
+ # Mac PyPy always takes the longest, and doesn't add anything.
- os: macos
python-version: "pypy-3.8"
+ - os: macos
+ python-version: "pypy-3.9"
+ - os: macos
+ python-version: "pypy-3.10"
# Windows pypy 3.9 and 3.10 get stuck with PyPy 7.3.15. I hope to
# unstick them, but I don't want that to block all other progress, so
# skip them for now.
@@ -66,6 +69,13 @@ jobs:
python-version: "pypy-3.9"
- os: windows
python-version: "pypy-3.10"
+ # Skip 3.13.0a4 and pin to 3.13.0a3 for Windows due to build error.
+ # Undo when 3.13.0a5 is released.
+ - os: windows
+ python-version: "3.13"
+ include:
+ - os: windows
+ python-version: "3.13.0-alpha.3"
# If one job fails, stop the whole thing.
fail-fast: true
@@ -232,7 +242,9 @@ jobs:
path: reports_repo/${{ env.report_dir }}
- name: "Push to report repo"
- if: ${{ github.ref == 'refs/heads/master' }}
+ if: |
+ github.repository_owner == 'nedbat'
+ && github.ref == 'refs/heads/master'
env:
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
run: |
@@ -256,7 +268,9 @@ jobs:
echo '[${{ env.url }}](${{ env.url }})' >> $GITHUB_STEP_SUMMARY
- name: "Create badge"
- if: ${{ github.ref == 'refs/heads/master' }}
+ if: |
+ github.repository_owner == 'nedbat'
+ && github.ref == 'refs/heads/master'
# https://gist.githubusercontent.com/nedbat/8c6980f77988a327348f9b02bbaf67f5
uses: schneegans/dynamic-badges-action@e9a478b16159b4d31420099ba146cdc50f134483
with:
diff --git a/.github/workflows/testsuite.yml b/.github/workflows/testsuite.yml
index e6742753e..ee94b1ea0 100644
--- a/.github/workflows/testsuite.yml
+++ b/.github/workflows/testsuite.yml
@@ -62,6 +62,13 @@ jobs:
python-version: "pypy-3.9"
- os: windows
python-version: "pypy-3.10"
+ # Skip 3.13.0a4 and pin to 3.13.0a3 for Windows due to build error.
+ # Undo when 3.13.0a5 is released.
+ - os: windows
+ python-version: "3.13"
+ include:
+ - os: windows
+ python-version: "3.13.0-alpha.3"
fail-fast: false
steps:
diff --git a/.readthedocs.yaml b/.readthedocs.yaml
index 1960ebca2..b02536f1a 100644
--- a/.readthedocs.yaml
+++ b/.readthedocs.yaml
@@ -16,8 +16,8 @@ sphinx:
builder: html
configuration: doc/conf.py
-# Build all the formats
-formats: all
+# Don't build anything except HTML.
+formats: []
python:
install:
diff --git a/CHANGES.rst b/CHANGES.rst
index a65101ea6..933aac7d8 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -9,6 +9,9 @@ These changes are listed in decreasing version number order. Note this can be
different from a strict chronological order when there are two branches in
development at the same time, such as 4.5.x and 5.0.
+See :ref:`migrating` for significant changes that might be required when
+upgrading your version of coverage.py.
+
.. When updating the "Unreleased" header to a specific version, use this
.. format. Don't forget the jump target:
..
@@ -19,6 +22,18 @@ development at the same time, such as 4.5.x and 5.0.
.. scriv-start-here
+.. _changes_7-4-2:
+
+Version 7.4.2 — 2024-02-20
+--------------------------
+
+- Fix: setting ``COVERAGE_CORE=sysmon`` no longer errors on 3.11 and lower,
+ thanks `Hugo van Kemenade `_. It now issues a warning that
+ sys.monitoring is not available and falls back to the default core instead.
+
+.. _pull 1747: https://github.com/nedbat/coveragepy/pull/1747
+
+
.. _changes_7-4-1:
Version 7.4.1 — 2024-01-26
@@ -886,10 +901,12 @@ Version 6.3 — 2022-01-25
Version 6.2 — 2021-11-26
------------------------
-- Feature: Now the ``--concurrency`` setting can now have a list of values, so
- that threads and another lightweight threading package can be measured
- together, such as ``--concurrency=gevent,thread``. Closes `issue 1012`_ and
- `issue 1082`_.
+- Feature: Now the ``--concurrency`` setting can have a list of values, so that
+ threads and another lightweight threading package can be measured together,
+ such as ``--concurrency=gevent,thread``. Closes `issue 1012`_ and `issue
+ 1082`_. This also means that ``thread`` must be explicitly specified in some
+ cases that used to be implicit such as ``--concurrency=multiprocessing``,
+ which must be changed to ``--concurrency=multiprocessing,thread``.
- Fix: A module specified as the ``source`` setting is imported during startup,
before the user program imports it. This could cause problems if the rest of
diff --git a/Makefile b/Makefile
index 52a6c4cce..cf81a8a38 100644
--- a/Makefile
+++ b/Makefile
@@ -179,19 +179,19 @@ sample_html_beta: _sample_cog_html ## Generate sample HTML report for a beta rel
REPO_OWNER = nedbat/coveragepy
-edit_for_release: ## Edit sources to insert release facts.
+edit_for_release: #: Edit sources to insert release facts (see howto.txt).
python igor.py edit_for_release
cheats: ## Create some useful snippets for releasing.
python igor.py cheats | tee cheats.txt
-relbranch: ## Create the branch for releasing.
+relbranch: #: Create the branch for releasing (see howto.txt).
git switch -c nedbat/release-$$(date +%Y%m%d)
-relcommit1: ## Commit the first release changes.
+relcommit1: #: Commit the first release changes (see howto.txt).
git commit -am "docs: prep for $$(python setup.py --version)"
-relcommit2: ## Commit the latest sample HTML report.
+relcommit2: #: Commit the latest sample HTML report (see howto.txt).
git commit -am "docs: sample HTML for $$(python setup.py --version)"
kit: ## Make the source distribution.
@@ -287,7 +287,7 @@ $(RELNOTES_JSON): $(CHANGES_MD)
$(DOCBIN)/python ci/parse_relnotes.py tmp/rst_rst/changes.md $(RELNOTES_JSON)
github_releases: $(DOCBIN) ## Update GitHub releases.
- $(DOCBIN)/python -m scriv github-release
+ $(DOCBIN)/python -m scriv github-release --all
comment_on_fixes: $(RELNOTES_JSON) ## Add a comment to issues that were fixed.
python ci/comment_on_fixes.py $(REPO_OWNER)
diff --git a/ci/comment_on_fixes.py b/ci/comment_on_fixes.py
index 08b4dee06..2f7dbdc47 100644
--- a/ci/comment_on_fixes.py
+++ b/ci/comment_on_fixes.py
@@ -7,7 +7,7 @@
import re
import sys
-import requests
+from session import get_session
with open("tmp/relnotes.json") as frn:
relnotes = json.load(frn)
@@ -27,14 +27,14 @@
if kind == "issues":
url = f"https://api.github.com/repos/{repo_owner}/issues/{number}"
- issue_data = requests.get(url).json()
+ issue_data = get_session().get(url).json()
if issue_data["state"] == "closed":
do_comment = True
else:
print(f"Still open, comment manually: {m[0]}")
else:
url = f"https://api.github.com/repos/{repo_owner}/pulls/{number}"
- pull_data = requests.get(url).json()
+ pull_data = get_session().get(url).json()
if pull_data["state"] == "closed":
if pull_data["merged"]:
do_comment = True
@@ -46,5 +46,5 @@
if do_comment:
print(f"Commenting on {m[0]}")
url = f"https://api.github.com/repos/{repo_owner}/issues/{number}/comments"
- resp = requests.post(url, json={"body": comment})
+ resp = get_session().post(url, json={"body": comment})
print(resp)
diff --git a/ci/download_gha_artifacts.py b/ci/download_gha_artifacts.py
index bb866833f..d91add0c3 100644
--- a/ci/download_gha_artifacts.py
+++ b/ci/download_gha_artifacts.py
@@ -13,12 +13,11 @@
import time
import zipfile
-import requests
-
+from session import get_session
def download_url(url, filename):
"""Download a file from `url` to `filename`."""
- response = requests.get(url, stream=True)
+ response = get_session().get(url, stream=True)
if response.status_code == 200:
with open(filename, "wb") as f:
for chunk in response.iter_content(16*1024):
@@ -60,7 +59,7 @@ def all_items(url, key):
"""
url += ("&" if "?" in url else "?") + "per_page=100"
while url:
- response = requests.get(url)
+ response = get_session().get(url)
response.raise_for_status()
data = response.json()
if isinstance(data, dict) and (msg := data.get("message")):
diff --git a/ci/session.py b/ci/session.py
new file mode 100644
index 000000000..48c6f0bcb
--- /dev/null
+++ b/ci/session.py
@@ -0,0 +1,27 @@
+# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
+# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
+
+"""Help make a requests Session with proper authentication."""
+
+import os
+
+import requests
+
+_SESSION = None
+
+def get_session():
+ """Get a properly authenticated requests Session."""
+
+ global _SESSION
+
+ if _SESSION is None:
+ # If GITHUB_TOKEN is in the environment, use it.
+ _SESSION = requests.session()
+ token = os.environ.get("GITHUB_TOKEN")
+ if token is not None:
+ _SESSION.headers["Authorization"] = f"token {token}"
+ # requests.get() will always prefer the .netrc file even if a header
+ # is already set. This tells it to ignore the .netrc file.
+ _SESSION.trust_env = False
+
+ return _SESSION
diff --git a/ci/trigger_build_kits.py b/ci/trigger_build_kits.py
index 0485df10a..4751016aa 100644
--- a/ci/trigger_build_kits.py
+++ b/ci/trigger_build_kits.py
@@ -5,7 +5,7 @@
import sys
-import requests
+from session import get_session
repo_owner = sys.argv[1]
@@ -18,9 +18,12 @@
# - build-kits
#
-resp = requests.post(
+resp = get_session().post(
f"https://api.github.com/repos/{repo_owner}/dispatches",
json={"event_type": "build-kits"},
)
-print(f"Status: {resp.status_code}")
-print(resp.text)
+if resp.status_code // 100 == 2:
+ print("Success")
+else:
+ print(f"Status: {resp.status_code}")
+ print(resp.text)
diff --git a/coverage/collector.py b/coverage/collector.py
index 1fd06dbb5..87cd620e3 100644
--- a/coverage/collector.py
+++ b/coverage/collector.py
@@ -150,6 +150,11 @@ def __init__(
core = "pytrace"
else:
core = os.getenv("COVERAGE_CORE")
+
+ if core == "sysmon" and not env.PYBEHAVIOR.pep669:
+ self.warn("sys.monitoring isn't available, using default core", slug="no-sysmon")
+ core = None
+
if not core:
# Once we're comfortable with sysmon as a default:
# if env.PYBEHAVIOR.pep669 and self.should_start_context is None:
diff --git a/coverage/sysmon.py b/coverage/sysmon.py
index ab231fde1..e6fe28fc3 100644
--- a/coverage/sysmon.py
+++ b/coverage/sysmon.py
@@ -251,11 +251,11 @@ def stop(self) -> None:
return
assert sys_monitoring is not None
sys_monitoring.set_events(self.myid, 0)
+ self.sysmon_on = False
for code in self.local_event_codes.values():
sys_monitoring.set_local_events(self.myid, code, 0)
self.local_event_codes = {}
sys_monitoring.free_tool_id(self.myid)
- self.sysmon_on = False
@panopticon()
def post_fork(self) -> None:
diff --git a/coverage/version.py b/coverage/version.py
index 2f953e709..69fe7597e 100644
--- a/coverage/version.py
+++ b/coverage/version.py
@@ -8,7 +8,7 @@
# version_info: same semantics as sys.version_info.
# _dev: the .devN suffix if any.
-version_info = (7, 4, 1, "final", 0)
+version_info = (7, 4, 2, "final", 0)
_dev = 0
diff --git a/doc/cmd.rst b/doc/cmd.rst
index a440e987c..439927d9c 100644
--- a/doc/cmd.rst
+++ b/doc/cmd.rst
@@ -273,6 +273,11 @@ Conflicting dynamic contexts (dynamic-conflict)
:meth:`.Coverage.switch_context` function to change the context. Only one of
these mechanisms should be in use at a time.
+sys.monitoring isn't available, using default core (no-sysmon)
+ You requested to use the sys.monitoring measurement core, but are running on
+ Python 3.11 or lower where it isn't available. A default core will be used
+ instead.
+
Individual warnings can be disabled with the :ref:`disable_warnings
` configuration setting. To silence "No data was
collected," add this to your configuration file:
diff --git a/doc/conf.py b/doc/conf.py
index 04ce4c0a6..18c5a3c70 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -67,11 +67,11 @@
# @@@ editable
copyright = "2009–2024, Ned Batchelder" # pylint: disable=redefined-builtin
# The short X.Y.Z version.
-version = "7.4.1"
+version = "7.4.2"
# The full version, including alpha/beta/rc tags.
-release = "7.4.1"
+release = "7.4.2"
# The date of release, in "monthname day, year" format.
-release_date = "January 26, 2024"
+release_date = "February 20, 2024"
# @@@ end
rst_epilog = """
diff --git a/doc/faq.rst b/doc/faq.rst
index d4f5a565e..500182e7b 100644
--- a/doc/faq.rst
+++ b/doc/faq.rst
@@ -136,25 +136,6 @@ It's good, but `it isn't perfect`__.
__ https://nedbatchelder.com/blog/200710/flaws_in_coverage_measurement.html
-.. Other resources
- ---------------
-
- There are a number of projects that help integrate coverage.py into other
- systems:
-
- - `trialcoverage`_ is a plug-in for Twisted trial.
-
- .. _trialcoverage: https://pypi.org/project/trialcoverage/
-
- - `pytest-cov`_
-
- .. _pytest-cov: https://pypi.org/project/pytest-cov/
-
- - `django-coverage`_ for use with Django.
-
- .. _django-coverage: https://pypi.org/project/django-coverage/
-
-
Q: Where can I get more help with coverage.py?
..............................................
@@ -168,7 +149,7 @@ Bug reports are gladly accepted at the `GitHub issue tracker`_.
.. _GitHub issue tracker: https://github.com/nedbat/coveragepy/issues
-`I can be reached`__ in a number of ways, I'm happy to answer questions about
+`I can be reached`__ in a number of ways. I'm happy to answer questions about
using coverage.py.
__ https://nedbatchelder.com/site/aboutned.html
diff --git a/doc/index.rst b/doc/index.rst
index 522c4a6bf..9ebcde8c5 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -240,6 +240,7 @@ More information
api
howitworks
plugins
+ other
contributing
trouble
faq
diff --git a/doc/migrating.rst b/doc/migrating.rst
index 443afac63..865ede3a0 100644
--- a/doc/migrating.rst
+++ b/doc/migrating.rst
@@ -8,10 +8,10 @@ Migrating between versions
==========================
New versions of coverage.py or Python might require you to adjust your
-settings, options, or other aspects how you use coverage.py. This page details
-those changes.
+settings, options, or other aspects of how you use coverage.py. This page
+details those changes.
-.. _migrating_cov7:
+.. _migrating_cov7x:
Migrating to coverage.py 7.x
----------------------------
@@ -41,6 +41,18 @@ Consider these changes when migrating to coverage.py 7.x:
updates.
+.. _migrating_cov62:
+
+Migrating to coverage.py 6.2
+----------------------------
+
+- The ``--concurrency`` settings changed in 6.2 to be a list of values. You
+ might need to explicitly list concurrency options that we previously implied.
+ For example, ``--concurrency=multiprocessing`` used to implicitly enable
+ thread concurrency. Now that must be explicitly enabled with
+ ``--concurrency=multiprocessing,thread``.
+
+
.. _migrating_py312:
Migrating to Python 3.12
diff --git a/doc/other.rst b/doc/other.rst
new file mode 100644
index 000000000..d0998b37f
--- /dev/null
+++ b/doc/other.rst
@@ -0,0 +1,131 @@
+.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
+.. For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
+
+.. _other:
+
+===============
+Other resources
+===============
+
+
+There are a number of projects that help integrate coverage.py into other
+systems, provide help using it, offer assistance, and so on.
+
+There's no guarantee these items are maintained or work well. Some of them
+seem to be quite old. If you have suggestions for updates to this page, `open
+a pull request`_ or `get in touch`_ some other way.
+
+.. _open a pull request: https://github.com/nedbat/coveragepy/blob/master/doc/other.rst
+.. _get in touch: https://nedbatchelder.com/site/aboutned.html
+
+Test runners
+------------
+
+Helpers for using coverage with specific test runners.
+
+* `pytest-cov`__ is a pytest plugin to coordinate coverage.py usage.
+
+ __ https://pypi.org/project/pytest-cov/
+
+* `trialcoverage`__ is a plug-in for Twisted trial.
+
+ __ https://pypi.org/project/trialcoverage/
+
+
+Configuration helpers
+---------------------
+
+Tools to provide more control over how coverage is configured.
+
+* `covdefaults`__ provides "sensible" default settings for coverage.
+
+ __ https://github.com/asottile/covdefaults
+
+* `coverage-conditional-plugin`__ lets you use conditions instead of simple "no
+ cover" pragmas to control what lines are considered under different
+ conditions.
+
+ __ https://github.com/wemake-services/coverage-conditional-plugin
+
+
+Language plugins
+----------------
+
+Coverage.py plugins to enable coverage measurement of other languages.
+
+* `django-coverage`__ measures the coverage of Django templates.
+
+ __ https://pypi.org/project/django-coverage/
+
+* `Cython`__ provides a plugin for measuring Cythonized code.
+
+ __ https://cython.readthedocs.io/en/latest/src/tutorial/profiling_tutorial.html#enabling-coverage-analysis
+
+* `coverage-jinja-plugin`__ is an incomplete Jinja2 plugin.
+
+ __ https://github.com/MrSenko/coverage-jinja-plugin
+
+* `coverage-sh`__ measures code coverage of shell (sh or bash) scripts executed
+ from Python with subprocess.
+
+ __ https://github.com/lackhove/coverage-sh
+
+* `hy-coverage`__ supports the Hy language.
+
+ __ https://github.com/timmartin/hy-coverage
+
+* `coverage-mako-plugin`__ measures coverage in Mako templates.
+ Doesn't work yet, probably needs some changes in Mako itself.
+
+ __ https://bitbucket-archive.softwareheritage.org/projects/ne/ned/coverage-mako-plugin.html
+
+
+Reporting helpers
+-----------------
+
+Helpers for seeing the results.
+
+* `python-coverage-comment-action`__ can publish a delta coverage report as a
+ pull request comment, create a coverage badge, or a dashboard to display in
+ your readme.
+
+ __ https://github.com/py-cov-action/python-coverage-comment-action
+
+* `diff-cover`__ reports on the coverage of lines changed in a pull request.
+
+ __ https://pypi.org/project/diff-cover/
+
+* `cuvner`__ offers alternate visualizations of coverage data, including ones
+ for use in terminals.
+
+ __ https://meejah.ca/projects/cuvner
+
+* `emacs-python-coverage`__ is an experimental Emacs package to report code
+ coverage output produced by Python's coverage package directly inside Emacs
+ buffers.
+
+ __ https://github.com/wbolster/emacs-python-coverage
+
+* `python-genbadge`__ provides a set of command line utilities to generate
+ badges for tools that do not provide one, including coverage badges.
+
+ __ https://smarie.github.io/python-genbadge/
+
+
+Other articles
+--------------
+
+Writings about ways to enhance your use of coverage.py.
+
+* `How to Ditch Codecov for Python Projects`__: using GitHub Actions to manage
+ coverage across versions and report on results.
+
+ __ https://hynek.me/articles/ditch-codecov-python/
+
+* `Making a coverage badge`__: using GitHub Actions to produce a colored badge.
+
+ __ https://nedbatchelder.com/blog/202209/making_a_coverage_badge.html
+
+* `Coverage goals`__: a sidecar tool for reporting on per-file coverage goals.
+
+ __ https://nedbatchelder.com/blog/202111/coverage_goals.html
diff --git a/doc/plugins.rst b/doc/plugins.rst
index 0bf3af935..7be4e4b6b 100644
--- a/doc/plugins.rst
+++ b/doc/plugins.rst
@@ -25,6 +25,8 @@ implementing coverage measurement for non-Python files.
Information about using plug-ins is on this page. To write a plug-in, see
:ref:`api_plugin`.
+See :ref:`other` for available plug-ins.
+
.. versionadded:: 4.0
@@ -133,27 +135,3 @@ a coverage.py plug-in called ``something.plugin``.
like "Plugin file tracers (something.plugin) aren't supported with
PyTracer," then you don't have the :ref:`C extension `
installed. The C extension is needed for certain plug-ins.
-
-
-Available plug-ins
-------------------
-
-Some coverage.py plug-ins you might find useful:
-
-* `Django template coverage.py plug-in`__: for measuring coverage in Django
- templates.
-
- .. __: https://pypi.org/project/django_coverage_plugin/
-
-* `Conditional coverage plug-in`__: for measuring coverage based
- on any rules you define!
- Can exclude different lines of code that are only executed
- on different platforms, python versions,
- and with different dependencies installed.
-
- .. __: https://github.com/wemake-services/coverage-conditional-plugin
-
-* `Mako template coverage plug-in`__: for measuring coverage in Mako templates.
- Doesn't work yet, probably needs some changes in Mako itself.
-
- .. __: https://bitbucket-archive.softwareheritage.org/projects/ne/ned/coverage-mako-plugin.html
diff --git a/doc/sample_html/d_7b071bdc2a35fa80___init___py.html b/doc/sample_html/d_7b071bdc2a35fa80___init___py.html
index f6a0e5eef..6457bf694 100644
--- a/doc/sample_html/d_7b071bdc2a35fa80___init___py.html
+++ b/doc/sample_html/d_7b071bdc2a35fa80___init___py.html
@@ -66,8 +66,8 @@