Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-pytest-cov for openSUSE:Factory checked in at 2026-04-14 17:48:07 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-pytest-cov (Old) and /work/SRC/openSUSE:Factory/.python-pytest-cov.new.21863 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pytest-cov" Tue Apr 14 17:48:07 2026 rev:37 rq:1346235 version:7.1.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-pytest-cov/python-pytest-cov.changes 2025-10-14 18:06:53.875180728 +0200 +++ /work/SRC/openSUSE:Factory/.python-pytest-cov.new.21863/python-pytest-cov.changes 2026-04-14 17:48:14.659353170 +0200 @@ -1,0 +2,28 @@ +Sun Apr 12 19:00:42 UTC 2026 - Dirk Müller <[email protected]> + +- update to 7.1.0: + * Fixed total coverage computation to always be consistent, + regardless of reporting settings. Previously some reports + could produce different total counts, and consequently can + make --cov-fail-under behave different depending on reporting + options. See #641. + * Improve handling of ResourceWarning from sqlite3. The plugin + adds warning filter for sqlite3 ResourceWarning unclosed + database (since 6.2.0). It checks if there is already + existing plugin for this message by comparing filter regular + expression. When filter is specified on command line the + message is escaped and does not match an expected message. A + check for an escaped regular expression is added to handle + this case. With this fix one can suppress ResourceWarning + from sqlite3 from command line: pytest -W "ignore:unclosed + database in <sqlite3.Connection object at:ResourceWarning" + * Various improvements to documentation. Contributed by Art + Pelling in #718 and "vivodi" in #738. Also closed #736. + * Fixed some assertions in tests. Contributed by in Markéta + Machová in #722. + * Removed unnecessary coverage configuration copying (meant as + a backup because reporting commands had configuration side- + effects before coverage 5.0). +- drop 0001-match-coverage-7.10.7-warnings.patch (upstream) + +------------------------------------------------------------------- Old: ---- 0001-match-coverage-7.10.7-warnings.patch pytest_cov-7.0.0.tar.gz New: ---- _scmsync.obsinfo build.specials.obscpio pytest_cov-7.1.0.tar.gz ----------(Old B)---------- Old: effects before coverage 5.0). - drop 0001-match-coverage-7.10.7-warnings.patch (upstream) ----------(Old E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-pytest-cov.spec ++++++ --- /var/tmp/diff_new_pack.cMwYY4/_old 2026-04-14 17:48:15.575391034 +0200 +++ /var/tmp/diff_new_pack.cMwYY4/_new 2026-04-14 17:48:15.575391034 +0200 @@ -26,14 +26,12 @@ %endif %{?sle15_python_module_pythons} Name: python-pytest-cov%{psuffix} -Version: 7.0.0 +Version: 7.1.0 Release: 0 Summary: Pytest plugin for coverage reporting License: MIT URL: https://github.com/pytest-dev/pytest-cov Source: https://files.pythonhosted.org/packages/source/p/pytest-cov/pytest_cov-%{version}.tar.gz -# PATCH-FIX-UPSTREAM https://github.com/pytest-dev/pytest-cov/pull/722 match coverage 7.10.7 warnings -Patch0: 0001-match-coverage-7.10.7-warnings.patch BuildRequires: %{python_module base >= 3.9} BuildRequires: %{python_module hatch-fancy-pypi-readme} BuildRequires: %{python_module hatchling} @@ -50,7 +48,7 @@ BuildRequires: python-rpm-macros Requires: python-coverage >= 7.10.6 Requires: python-pluggy >= 1.2 -Requires: python-pytest >= 6.2.5 +Requires: python-pytest >= 7 BuildArch: noarch %python_subpackages ++++++ _scmsync.obsinfo ++++++ mtime: 1776020661 commit: 55df4e0eb09ad0196bf214cea1ad5f87d7132ac87ad16b72ca49735bf404c417 url: https://src.opensuse.org/python-pytest/python-pytest-cov.git revision: 55df4e0eb09ad0196bf214cea1ad5f87d7132ac87ad16b72ca49735bf404c417 projectscmsync: https://src.opensuse.org/python-pytest/_ObsPrj.git ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-04-12 21:04:50.000000000 +0200 @@ -0,0 +1 @@ +.osc ++++++ pytest_cov-7.0.0.tar.gz -> pytest_cov-7.1.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/.bumpversion.cfg new/pytest_cov-7.1.0/.bumpversion.cfg --- old/pytest_cov-7.0.0/.bumpversion.cfg 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/.bumpversion.cfg 2020-02-02 01:00:00.000000000 +0100 @@ -1,5 +1,5 @@ [bumpversion] -current_version = 7.0.0 +current_version = 7.1.0 commit = True tag = True diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/.cookiecutterrc new/pytest_cov-7.1.0/.cookiecutterrc --- old/pytest_cov-7.0.0/.cookiecutterrc 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/.cookiecutterrc 2020-02-02 01:00:00.000000000 +0100 @@ -40,7 +40,7 @@ sphinx_doctest: 'no' sphinx_theme: sphinx-py3doc-enhanced-theme test_matrix_separate_coverage: 'no' - version: 7.0.0 + version: 7.1.0 version_manager: bump2version website: http://blog.ionelmc.ro year_from: '2010' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/.editorconfig new/pytest_cov-7.1.0/.editorconfig --- old/pytest_cov-7.0.0/.editorconfig 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/.editorconfig 2020-02-02 01:00:00.000000000 +0100 @@ -10,6 +10,9 @@ indent_size = 4 charset = utf-8 +[*.py] +max_line_length = 140 + [*.{bat,cmd,ps1}] end_of_line = crlf diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/.github/workflows/test.yml new/pytest_cov-7.1.0/.github/workflows/test.yml --- old/pytest_cov-7.0.0/.github/workflows/test.yml 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/.github/workflows/test.yml 2020-02-02 01:00:00.000000000 +0100 @@ -6,14 +6,14 @@ strategy: fail-fast: false matrix: - python-version: ["pypy-3.9", "3.11"] + python-version: ["pypy-3.11", "3.11"] target: [ "src-layout", "adhoc-layout", ] include: # Add new helper variables to existing jobs - - {python-version: "pypy-3.9", tox-python-version: "pypy3"} + - {python-version: "pypy-3.11", tox-python-version: "pypy11"} - {python-version: "3.11", tox-python-version: "py311"} steps: - uses: actions/checkout@v5 @@ -24,7 +24,7 @@ python-version: ${{ matrix.python-version }} - name: Cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.cache/pip key: @@ -60,152 +60,170 @@ toxpython: 'python3.11' tox_env: 'docs' os: 'ubuntu-latest' - - name: 'py39-pytest84-xdist38-coverage710 (ubuntu)' - python: '3.9' - toxpython: 'python3.9' - python_arch: 'x64' - tox_env: 'py39-pytest84-xdist38-coverage710' - os: 'ubuntu-latest' - - name: 'py39-pytest84-xdist38-coverage710 (windows)' - python: '3.9' - toxpython: 'python3.9' - python_arch: 'x64' - tox_env: 'py39-pytest84-xdist38-coverage710' - os: 'windows-latest' - - name: 'py39-pytest84-xdist38-coverage710 (macos)' - python: '3.9' - toxpython: 'python3.9' - python_arch: 'arm64' - tox_env: 'py39-pytest84-xdist38-coverage710' - os: 'macos-latest' - - name: 'py310-pytest84-xdist38-coverage710 (ubuntu)' + - name: 'py310-pytest90-xdist38-coverage713 (ubuntu)' python: '3.10' toxpython: 'python3.10' python_arch: 'x64' - tox_env: 'py310-pytest84-xdist38-coverage710' + tox_env: 'py310-pytest90-xdist38-coverage713' os: 'ubuntu-latest' - - name: 'py310-pytest84-xdist38-coverage710 (windows)' + - name: 'py310-pytest90-xdist38-coverage713 (windows)' python: '3.10' toxpython: 'python3.10' python_arch: 'x64' - tox_env: 'py310-pytest84-xdist38-coverage710' + tox_env: 'py310-pytest90-xdist38-coverage713' os: 'windows-latest' - - name: 'py310-pytest84-xdist38-coverage710 (macos)' + - name: 'py310-pytest90-xdist38-coverage713 (macos)' python: '3.10' toxpython: 'python3.10' python_arch: 'arm64' - tox_env: 'py310-pytest84-xdist38-coverage710' + tox_env: 'py310-pytest90-xdist38-coverage713' os: 'macos-latest' - - name: 'py311-pytest84-xdist38-coverage710 (ubuntu)' + - name: 'py311-pytest90-xdist38-coverage713 (ubuntu)' python: '3.11' toxpython: 'python3.11' python_arch: 'x64' - tox_env: 'py311-pytest84-xdist38-coverage710' + tox_env: 'py311-pytest90-xdist38-coverage713' os: 'ubuntu-latest' - - name: 'py311-pytest84-xdist38-coverage710 (windows)' + - name: 'py311-pytest90-xdist38-coverage713 (windows)' python: '3.11' toxpython: 'python3.11' python_arch: 'x64' - tox_env: 'py311-pytest84-xdist38-coverage710' + tox_env: 'py311-pytest90-xdist38-coverage713' os: 'windows-latest' - - name: 'py311-pytest84-xdist38-coverage710 (macos)' + - name: 'py311-pytest90-xdist38-coverage713 (macos)' python: '3.11' toxpython: 'python3.11' python_arch: 'arm64' - tox_env: 'py311-pytest84-xdist38-coverage710' + tox_env: 'py311-pytest90-xdist38-coverage713' os: 'macos-latest' - - name: 'py312-pytest84-xdist38-coverage710 (ubuntu)' + - name: 'py312-pytest90-xdist38-coverage713 (ubuntu)' python: '3.12' toxpython: 'python3.12' python_arch: 'x64' - tox_env: 'py312-pytest84-xdist38-coverage710' + tox_env: 'py312-pytest90-xdist38-coverage713' os: 'ubuntu-latest' - - name: 'py312-pytest84-xdist38-coverage710 (windows)' + - name: 'py312-pytest90-xdist38-coverage713 (windows)' python: '3.12' toxpython: 'python3.12' python_arch: 'x64' - tox_env: 'py312-pytest84-xdist38-coverage710' + tox_env: 'py312-pytest90-xdist38-coverage713' os: 'windows-latest' - - name: 'py312-pytest84-xdist38-coverage710 (macos)' + - name: 'py312-pytest90-xdist38-coverage713 (macos)' python: '3.12' toxpython: 'python3.12' python_arch: 'arm64' - tox_env: 'py312-pytest84-xdist38-coverage710' + tox_env: 'py312-pytest90-xdist38-coverage713' os: 'macos-latest' - - name: 'py313-pytest84-xdist38-coverage710 (ubuntu)' + - name: 'py313-pytest90-xdist38-coverage713 (ubuntu)' python: '3.13' toxpython: 'python3.13' python_arch: 'x64' - tox_env: 'py313-pytest84-xdist38-coverage710' + tox_env: 'py313-pytest90-xdist38-coverage713' os: 'ubuntu-latest' - - name: 'py313-pytest84-xdist38-coverage710 (windows)' + - name: 'py313-pytest90-xdist38-coverage713 (windows)' python: '3.13' toxpython: 'python3.13' python_arch: 'x64' - tox_env: 'py313-pytest84-xdist38-coverage710' + tox_env: 'py313-pytest90-xdist38-coverage713' os: 'windows-latest' - - name: 'py313-pytest84-xdist38-coverage710 (macos)' + - name: 'py313-pytest90-xdist38-coverage713 (macos)' python: '3.13' toxpython: 'python3.13' python_arch: 'arm64' - tox_env: 'py313-pytest84-xdist38-coverage710' + tox_env: 'py313-pytest90-xdist38-coverage713' os: 'macos-latest' - - name: 'pypy39-pytest84-xdist38-coverage710 (ubuntu)' - python: 'pypy-3.9' - toxpython: 'pypy3.9' + - name: 'py314-pytest90-xdist38-coverage713 (ubuntu)' + python: '3.14' + toxpython: 'python3.14' python_arch: 'x64' - tox_env: 'pypy39-pytest84-xdist38-coverage710' + tox_env: 'py314-pytest90-xdist38-coverage713' os: 'ubuntu-latest' - - name: 'pypy39-pytest84-xdist38-coverage710 (windows)' - python: 'pypy-3.9' - toxpython: 'pypy3.9' + - name: 'py314-pytest90-xdist38-coverage713 (windows)' + python: '3.14' + toxpython: 'python3.14' python_arch: 'x64' - tox_env: 'pypy39-pytest84-xdist38-coverage710' + tox_env: 'py314-pytest90-xdist38-coverage713' os: 'windows-latest' - - name: 'pypy39-pytest84-xdist38-coverage710 (macos)' - python: 'pypy-3.9' - toxpython: 'pypy3.9' + - name: 'py314-pytest90-xdist38-coverage713 (macos)' + python: '3.14' + toxpython: 'python3.14' python_arch: 'arm64' - tox_env: 'pypy39-pytest84-xdist38-coverage710' + tox_env: 'py314-pytest90-xdist38-coverage713' os: 'macos-latest' - - name: 'pypy310-pytest84-xdist38-coverage710 (ubuntu)' + - name: 'pypy310-pytest90-xdist38-coverage713 (ubuntu)' python: 'pypy-3.10' toxpython: 'pypy3.10' python_arch: 'x64' - tox_env: 'pypy310-pytest84-xdist38-coverage710' + tox_env: 'pypy310-pytest90-xdist38-coverage713' os: 'ubuntu-latest' - - name: 'pypy310-pytest84-xdist38-coverage710 (windows)' + - name: 'pypy310-pytest90-xdist38-coverage713 (windows)' python: 'pypy-3.10' toxpython: 'pypy3.10' python_arch: 'x64' - tox_env: 'pypy310-pytest84-xdist38-coverage710' + tox_env: 'pypy310-pytest90-xdist38-coverage713' os: 'windows-latest' - - name: 'pypy310-pytest84-xdist38-coverage710 (macos)' + - name: 'pypy310-pytest90-xdist38-coverage713 (macos)' python: 'pypy-3.10' toxpython: 'pypy3.10' python_arch: 'arm64' - tox_env: 'pypy310-pytest84-xdist38-coverage710' + tox_env: 'pypy310-pytest90-xdist38-coverage713' os: 'macos-latest' - - name: 'pypy311-pytest84-xdist38-coverage710 (ubuntu)' + - name: 'pypy311-pytest90-xdist38-coverage713 (ubuntu)' python: 'pypy-3.11' toxpython: 'pypy3.11' python_arch: 'x64' - tox_env: 'pypy311-pytest84-xdist38-coverage710' + tox_env: 'pypy311-pytest90-xdist38-coverage713' os: 'ubuntu-latest' - - name: 'pypy311-pytest84-xdist38-coverage710 (windows)' + - name: 'pypy311-pytest90-xdist38-coverage713 (windows)' python: 'pypy-3.11' toxpython: 'pypy3.11' python_arch: 'x64' - tox_env: 'pypy311-pytest84-xdist38-coverage710' + tox_env: 'pypy311-pytest90-xdist38-coverage713' os: 'windows-latest' - - name: 'pypy311-pytest84-xdist38-coverage710 (macos)' + - name: 'pypy311-pytest90-xdist38-coverage713 (macos)' python: 'pypy-3.11' toxpython: 'pypy3.11' python_arch: 'arm64' - tox_env: 'pypy311-pytest84-xdist38-coverage710' + tox_env: 'pypy311-pytest90-xdist38-coverage713' + os: 'macos-latest' + - name: 'py39-pytest80-xdist38-coverage710 (ubuntu)' + python: '3.9' + toxpython: 'python3.9' + python_arch: 'x64' + tox_env: 'py39-pytest80-xdist38-coverage710' + os: 'ubuntu-latest' + - name: 'py39-pytest80-xdist38-coverage710 (windows)' + python: '3.9' + toxpython: 'python3.9' + python_arch: 'x64' + tox_env: 'py39-pytest80-xdist38-coverage710' + os: 'windows-latest' + - name: 'py39-pytest80-xdist38-coverage710 (macos)' + python: '3.9' + toxpython: 'python3.9' + python_arch: 'arm64' + tox_env: 'py39-pytest80-xdist38-coverage710' + os: 'macos-latest' + - name: 'pypy39-pytest80-xdist38-coverage710 (ubuntu)' + python: 'pypy-3.9' + toxpython: 'pypy3.9' + python_arch: 'x64' + tox_env: 'pypy39-pytest80-xdist38-coverage710' + os: 'ubuntu-latest' + - name: 'pypy39-pytest80-xdist38-coverage710 (windows)' + python: 'pypy-3.9' + toxpython: 'pypy3.9' + python_arch: 'x64' + tox_env: 'pypy39-pytest80-xdist38-coverage710' + os: 'windows-latest' + - name: 'pypy39-pytest80-xdist38-coverage710 (macos)' + python: 'pypy-3.9' + toxpython: 'pypy3.9' + python_arch: 'arm64' + tox_env: 'pypy39-pytest80-xdist38-coverage710' os: 'macos-latest' steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 - uses: actions/setup-python@v6 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/.pre-commit-config.yaml new/pytest_cov-7.1.0/.pre-commit-config.yaml --- old/pytest_cov-7.0.0/.pre-commit-config.yaml 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/.pre-commit-config.yaml 2020-02-02 01:00:00.000000000 +0100 @@ -1,12 +1,12 @@ # To install the git pre-commit hooks run: -# pre-commit install --install-hooks +# prek install --install-hooks --overwrite # To update the versions: -# pre-commit autoupdate +# prek autoupdate exclude: '^(\.tox|ci/templates|\.bumpversion\.cfg)(/|$)' # Note the order is intentional to avoid multiple passes of the hooks repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.12.12 + rev: v0.15.4 hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix, --show-fixes, --unsafe-fixes] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/.readthedocs.yml new/pytest_cov-7.1.0/.readthedocs.yml --- old/pytest_cov-7.0.0/.readthedocs.yml 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/.readthedocs.yml 2020-02-02 01:00:00.000000000 +0100 @@ -4,7 +4,7 @@ configuration: docs/conf.py formats: all build: - os: ubuntu-22.04 + os: ubuntu-24.04 tools: python: "3" python: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/AUTHORS.rst new/pytest_cov-7.1.0/AUTHORS.rst --- old/pytest_cov-7.0.0/AUTHORS.rst 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/AUTHORS.rst 2020-02-02 01:00:00.000000000 +0100 @@ -65,3 +65,5 @@ * Tsvika Shapira - https://github.com/tsvikas * Marcos Boger - https://github.com/marcosboger * Ofek Lev - https://github.com/ofek +* Art Pelling - https://github.com/artpelling +* Markéta Machová - https://github.com/MeggyCal diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/CHANGELOG.rst new/pytest_cov-7.1.0/CHANGELOG.rst --- old/pytest_cov-7.0.0/CHANGELOG.rst 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/CHANGELOG.rst 2020-02-02 01:00:00.000000000 +0100 @@ -2,6 +2,32 @@ Changelog ========= +7.1.0 (2026-03-21) +------------------ + +* Fixed total coverage computation to always be consistent, regardless of reporting settings. + Previously some reports could produce different total counts, and consequently can make --cov-fail-under behave different depending on + reporting options. + See `#641 <https://github.com/pytest-dev/pytest-cov/issues/641>`_. + +* Improve handling of ResourceWarning from sqlite3. + + The plugin adds warning filter for sqlite3 ``ResourceWarning`` unclosed database (since 6.2.0). + It checks if there is already existing plugin for this message by comparing filter regular expression. + When filter is specified on command line the message is escaped and does not match an expected message. + A check for an escaped regular expression is added to handle this case. + + With this fix one can suppress ``ResourceWarning`` from sqlite3 from command line:: + + pytest -W "ignore:unclosed database in <sqlite3.Connection object at:ResourceWarning" ... +* Various improvements to documentation. + Contributed by Art Pelling in `#718 <https://github.com/pytest-dev/pytest-cov/pull/718>`_ and + "vivodi" in `#738 <https://github.com/pytest-dev/pytest-cov/pull/738>`_. + Also closed `#736 <https://github.com/pytest-dev/pytest-cov/issues/736>`_. +* Fixed some assertions in tests. + Contributed by in Markéta Machová in `#722 <https://github.com/pytest-dev/pytest-cov/pull/722>`_. +* Removed unnecessary coverage configuration copying (meant as a backup because reporting commands had configuration side-effects before coverage 5.0). + 7.0.0 (2025-09-09) ------------------ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/PKG-INFO new/pytest_cov-7.1.0/PKG-INFO --- old/pytest_cov-7.0.0/PKG-INFO 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/PKG-INFO 2020-02-02 01:00:00.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.4 Name: pytest-cov -Version: 7.0.0 +Version: 7.1.0 Summary: Pytest plugin for measuring coverage. Project-URL: Sources, https://github.com/pytest-dev/pytest-cov Project-URL: Documentation, https://pytest-cov.readthedocs.io/ @@ -27,6 +27,7 @@ Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Software Development :: Testing @@ -83,9 +84,9 @@ :alt: Supported implementations :target: https://pypi.org/project/pytest-cov -.. |commits-since| image:: https://img.shields.io/github/commits-since/pytest-dev/pytest-cov/v7.0.0.svg +.. |commits-since| image:: https://img.shields.io/github/commits-since/pytest-dev/pytest-cov/v7.1.0.svg :alt: Commits since latest release - :target: https://github.com/pytest-dev/pytest-cov/compare/v7.0.0...master + :target: https://github.com/pytest-dev/pytest-cov/compare/v7.1.0...master .. end-badges @@ -198,6 +199,32 @@ Changelog ========= +7.1.0 (2026-03-21) +------------------ + +* Fixed total coverage computation to always be consistent, regardless of reporting settings. + Previously some reports could produce different total counts, and consequently can make --cov-fail-under behave different depending on + reporting options. + See `#641 <https://github.com/pytest-dev/pytest-cov/issues/641>`_. + +* Improve handling of ResourceWarning from sqlite3. + + The plugin adds warning filter for sqlite3 ``ResourceWarning`` unclosed database (since 6.2.0). + It checks if there is already existing plugin for this message by comparing filter regular expression. + When filter is specified on command line the message is escaped and does not match an expected message. + A check for an escaped regular expression is added to handle this case. + + With this fix one can suppress ``ResourceWarning`` from sqlite3 from command line:: + + pytest -W "ignore:unclosed database in <sqlite3.Connection object at:ResourceWarning" ... +* Various improvements to documentation. + Contributed by Art Pelling in `#718 <https://github.com/pytest-dev/pytest-cov/pull/718>`_ and + "vivodi" in `#738 <https://github.com/pytest-dev/pytest-cov/pull/738>`_. + Also closed `#736 <https://github.com/pytest-dev/pytest-cov/issues/736>`_. +* Fixed some assertions in tests. + Contributed by in Markéta Machová in `#722 <https://github.com/pytest-dev/pytest-cov/pull/722>`_. +* Removed unnecessary coverage configuration copying (meant as a backup because reporting commands had configuration side-effects before coverage 5.0). + 7.0.0 (2025-09-09) ------------------ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/README.rst new/pytest_cov-7.1.0/README.rst --- old/pytest_cov-7.0.0/README.rst 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/README.rst 2020-02-02 01:00:00.000000000 +0100 @@ -40,9 +40,9 @@ :alt: Supported implementations :target: https://pypi.org/project/pytest-cov -.. |commits-since| image:: https://img.shields.io/github/commits-since/pytest-dev/pytest-cov/v7.0.0.svg +.. |commits-since| image:: https://img.shields.io/github/commits-since/pytest-dev/pytest-cov/v7.1.0.svg :alt: Commits since latest release - :target: https://github.com/pytest-dev/pytest-cov/compare/v7.0.0...master + :target: https://github.com/pytest-dev/pytest-cov/compare/v7.1.0...master .. end-badges diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/ci/bootstrap.py new/pytest_cov-7.1.0/ci/bootstrap.py --- old/pytest_cov-7.0.0/ci/bootstrap.py 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/ci/bootstrap.py 2020-02-02 01:00:00.000000000 +0100 @@ -57,7 +57,7 @@ # This uses sys.executable the same way that the call in # cookiecutter-pylibrary/hooks/post_gen_project.py # invokes this bootstrap.py itself. - for line in subprocess.check_output([sys.executable, '-m', 'tox', '--listenvs'], universal_newlines=True).splitlines() + for line in subprocess.check_output([sys.executable, '-m', 'tox', '--listenvs'], text=True).splitlines() ] tox_environments = [line for line in tox_environments if line.startswith('py')] for template in templates_path.rglob('*'): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/ci/templates/.github/workflows/test.yml new/pytest_cov-7.1.0/ci/templates/.github/workflows/test.yml --- old/pytest_cov-7.0.0/ci/templates/.github/workflows/test.yml 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/ci/templates/.github/workflows/test.yml 2020-02-02 01:00:00.000000000 +0100 @@ -7,14 +7,14 @@ strategy: fail-fast: false matrix: - python-version: ["pypy-3.9", "3.11"] + python-version: ["pypy-3.11", "3.11"] target: [ "src-layout", "adhoc-layout", ] include: # Add new helper variables to existing jobs - - {python-version: "pypy-3.9", tox-python-version: "pypy3"} + - {python-version: "pypy-3.11", tox-python-version: "pypy11"} - {python-version: "3.11", tox-python-version: "py311"} steps: - uses: actions/checkout@v5 @@ -25,7 +25,7 @@ python-version: ${{ matrix.python-version }} - name: Cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.cache/pip key: @@ -88,7 +88,7 @@ {% endfor %} {% endfor %} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 - uses: actions/setup-python@v6 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/docs/conf.py new/pytest_cov-7.1.0/docs/conf.py --- old/pytest_cov-7.0.0/docs/conf.py 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/docs/conf.py 2020-02-02 01:00:00.000000000 +0100 @@ -21,7 +21,7 @@ year = '2010-2024' author = 'pytest-cov contributors' copyright = f'{year}, {author}' -version = release = '7.0.0' +version = release = '7.1.0' pygments_style = 'trac' templates_path = ['.'] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/docs/config.rst new/pytest_cov-7.1.0/docs/config.rst --- old/pytest_cov-7.0.0/docs/config.rst 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/docs/config.rst 2020-02-02 01:00:00.000000000 +0100 @@ -2,24 +2,25 @@ Configuration ============= -This plugin provides a clean minimal set of command line options that are added to pytest. For -further control of coverage use a coverage config file. +This plugin provides a clean minimal set of command line options that are added to pytest. For +further control of coverage use a `coverage config file`_. -For example if tests are contained within the directory tree being measured the tests may be -excluded if desired by using a .coveragerc file with the omit option set:: +CLI options: + --cov [SOURCE] Path or package name to measure during execution (multi-allowed). Use --cov= to not do any source filtering and record everything. + --cov-reset Reset cov sources accumulated in options so far. + --cov-report TYPE Type of report to generate: term, term-missing, annotate, html, xml, json, markdown, markdown-append, lcov (multi-allowed). term, term-missing may be followed by ":skip-covered". + annotate, html, xml, json, markdown, markdown-append and lcov may be followed by ":DEST" where DEST specifies the output location. Use --cov-report= to not generate any output. + --cov-config PATH Config file for coverage. Default: .coveragerc + --no-cov-on-fail Do not report coverage if test run fails. Default: False + --no-cov Disable coverage report completely (useful for debuggers). Default: False + --cov-fail-under MIN Fail if the total coverage is less than MIN. + --cov-append Do not delete coverage but append to current. Default: False + --cov-branch Enable branch coverage. Can also be specified in the `coverage config file`_ ``[run]`` section. + --cov-precision COV_PRECISION + Override the reporting precision. Can also be specified in the `coverage config file`_ ``[report]`` section. + --cov-context CONTEXT + Dynamic contexts to use. "test" for now. - pytest --cov-config=.coveragerc - --cov=myproj - myproj/tests/ - -Where the .coveragerc file contains file globs:: - - [run] - omit = tests/* - -For full details refer to the `coverage config file`_ documentation. - -.. _`coverage config file`: https://coverage.readthedocs.io/en/latest/config.html .. note:: Important Note @@ -32,7 +33,7 @@ If you use the ``--cov-branch`` option then coverage's ``branch`` option will also get overridden. -If you wish to always add pytest-cov with pytest, you can use ``addopts`` under the ``pytest`` or ``tool:pytest`` section of +If you wish to always run pytest-cov with pytest, you can use ``addopts`` under the ``pytest`` or ``tool:pytest`` section of your ``setup.cfg``, or the ``tool.pytest.ini_options`` section of your ``pyproject.toml`` file. For example, in ``setup.cfg``: :: @@ -45,6 +46,12 @@ [tool.pytest.ini_options] addopts = "--cov=<project-name> --cov-report html" + +.. note:: Important Note + + The ``--cov`` option has an optional argument. If it's your last option in addopts_ it might eat the next CLI argument, make sure to + force it to take a blank value if that's what you wanted by using ``--cov=`` (essentially the same as ``--cov=""``). + Caveats ======= @@ -57,27 +64,5 @@ Also, if you change the working directory and also use subprocesses in a test you might also need to use ``--cov-config`` to make pytest-cov use the expected configuration file in the subprocess. -Reference -========= - -The complete list of command line options is: - ---cov=PATH Measure coverage for filesystem path. (multi-allowed) ---cov-report=type Type of report to generate: term, term-missing, - annotate, html, xml, json, markdown, markdown-append, lcov (multi-allowed). term, term- - missing may be followed by ":skip-covered". annotate, - html, xml, json, markdown, markdown-append and lcov may be followed by ":DEST" where DEST - specifies the output location. Use --cov-report= to - not generate any output. ---cov-config=path Config file for coverage. Default: .coveragerc ---no-cov-on-fail Do not report coverage if test run fails. Default: - False ---no-cov Disable coverage report completely (useful for - debuggers). Default: False ---cov-reset Reset cov sources accumulated in options so far. - Mostly useful for scripts and configuration files. ---cov-fail-under=MIN Fail if the total coverage is less than MIN. ---cov-append Do not delete coverage but append to current. Default: - False ---cov-branch Enable branch coverage. ---cov-context Choose the method for setting the dynamic context. +.. _`coverage config file`: https://coverage.readthedocs.io/en/latest/config.html +.. _addopts: https://docs.pytest.org/en/stable/reference/reference.html#confval-addopts> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/docs/reporting.rst new/pytest_cov-7.1.0/docs/reporting.rst --- old/pytest_cov-7.0.0/docs/reporting.rst 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/docs/reporting.rst 2020-02-02 01:00:00.000000000 +0100 @@ -49,7 +49,7 @@ You can use ``skip-covered`` with ``term-missing`` as well. e.g. ``--cov-report term-missing:skip-covered`` -If any reporting options are used then the default (``--cov-report=term`` is not added automatically). For example this would not show any +If any reporting options are used then the default (``--cov-report=term``) is not added automatically. For example this would not show any terminal output: .. code-block:: bash @@ -82,7 +82,7 @@ .. code-block:: bash - pytest --cov-report=markdown-append:${GITHUB_STEP_SUMMARY}. + pytest --cov-report markdown-append:$GITHUB_STEP_SUMMARY --cov=myproj tests/ To disable the default ``term`` report provide an empty report: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/examples/adhoc-layout/.coveragerc new/pytest_cov-7.1.0/examples/adhoc-layout/.coveragerc --- old/pytest_cov-7.0.0/examples/adhoc-layout/.coveragerc 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/examples/adhoc-layout/.coveragerc 2020-02-02 01:00:00.000000000 +0100 @@ -5,11 +5,10 @@ [run] branch = true -parallel = true source = example . [report] -show_missing = true precision = 2 +show_missing = true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/examples/adhoc-layout/tox.ini new/pytest_cov-7.1.0/examples/adhoc-layout/tox.ini --- old/pytest_cov-7.0.0/examples/adhoc-layout/tox.ini 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/examples/adhoc-layout/tox.ini 2020-02-02 01:00:00.000000000 +0100 @@ -1,14 +1,12 @@ [tox] -envlist = pypy3,py39,report +envlist = clean,pypy311,py311,report [tool:pytest] addopts = --cov-report=term-missing [testenv] -setenv = - py{py3,39}: COVERAGE_FILE = .coverage.{envname} -commands = pytest --cov --cov-config={toxinidir}/.coveragerc {posargs:-vv} +commands = pytest --cov --cov-append --cov-config={toxinidir}/.coveragerc {posargs:-vv} deps = pytest coverage @@ -19,15 +17,20 @@ ../.. depends = - report: pypy3,py39 + report: pypy311,py311 + {pypy311,py311}: clean # note that this is necessary to prevent the tests importing the code from your badly laid project changedir = tests +[testenv:clean] +skip_install = true +deps = coverage +commands = + coverage erase + [testenv:report] skip_install = true deps = coverage commands = - coverage combine - coverage html coverage report --fail-under=100 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/examples/src-layout/.coveragerc new/pytest_cov-7.1.0/examples/src-layout/.coveragerc --- old/pytest_cov-7.0.0/examples/src-layout/.coveragerc 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/examples/src-layout/.coveragerc 2020-02-02 01:00:00.000000000 +0100 @@ -5,11 +5,10 @@ [run] branch = true -parallel = true source = src/example tests [report] -show_missing = true precision = 2 +show_missing = true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/examples/src-layout/tox.ini new/pytest_cov-7.1.0/examples/src-layout/tox.ini --- old/pytest_cov-7.0.0/examples/src-layout/tox.ini 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/examples/src-layout/tox.ini 2020-02-02 01:00:00.000000000 +0100 @@ -1,5 +1,5 @@ [tox] -envlist = clean,pypy310,py310,report +envlist = clean,pypy311,py311,report [tool:pytest] testpaths = tests @@ -18,8 +18,8 @@ ../.. depends = - report: pypy310,py310 - {pypy310,py310}: clean + report: pypy311,py311 + {pypy311,py311}: clean [testenv:clean] skip_install = true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/pyproject.toml new/pytest_cov-7.1.0/pyproject.toml --- old/pytest_cov-7.0.0/pyproject.toml 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/pyproject.toml 2020-02-02 01:00:00.000000000 +0100 @@ -5,7 +5,7 @@ [project] name = "pytest-cov" dynamic = ["readme"] -version = "7.0.0" +version = "7.1.0" description = "Pytest plugin for measuring coverage." license = "MIT" requires-python = ">=3.9" @@ -39,6 +39,7 @@ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development :: Testing", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/src/pytest_cov/__init__.py new/pytest_cov-7.1.0/src/pytest_cov/__init__.py --- old/pytest_cov-7.0.0/src/pytest_cov/__init__.py 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/src/pytest_cov/__init__.py 2020-02-02 01:00:00.000000000 +0100 @@ -1,6 +1,6 @@ """pytest-cov: avoid already-imported warning: PYTEST_DONT_REWRITE.""" -__version__ = '7.0.0' +__version__ = '7.1.0' import pytest diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/src/pytest_cov/engine.py new/pytest_cov-7.1.0/src/pytest_cov/engine.py --- old/pytest_cov-7.0.0/src/pytest_cov/engine.py 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/src/pytest_cov/engine.py 2020-02-02 01:00:00.000000000 +0100 @@ -2,7 +2,6 @@ import argparse import contextlib -import copy import functools import os import random @@ -31,16 +30,6 @@ pass [email protected] -def _backup(obj, attr): - backup = getattr(obj, attr) - try: - setattr(obj, attr, copy.copy(backup)) - yield - finally: - setattr(obj, attr, backup) - - def _ensure_topdir(meth): @functools.wraps(meth) def ensure_topdir_wrapper(self, *args, **kwargs): @@ -150,11 +139,8 @@ @_ensure_topdir def summary(self, stream): """Produce coverage reports.""" - total = None - if not self.cov_report: - with _backup(self.cov, 'config'): - return self.cov.report(show_missing=True, ignore_errors=True, file=_NullFile) + total = self.cov.report(ignore_errors=True, output_format='total', precision=self.cov_precision, file=_NullFile) # Output coverage section header. if len(self.node_descs) == 1: @@ -181,20 +167,17 @@ } skip_covered = isinstance(self.cov_report, dict) and 'skip-covered' in self.cov_report.values() options.update({'skip_covered': skip_covered or None}) - with _backup(self.cov, 'config'): - total = self.cov.report(**options) + self.cov.report(**options) # Produce annotated source code report if wanted. if 'annotate' in self.cov_report: annotate_dir = self.cov_report['annotate'] - with _backup(self.cov, 'config'): - self.cov.annotate(ignore_errors=True, directory=annotate_dir) + self.cov.annotate(ignore_errors=True, directory=annotate_dir) # We need to call Coverage.report here, just to get the total # Coverage.annotate don't return any total and we need it for --cov-fail-under. - with _backup(self.cov, 'config'): - total = self.cov.report(ignore_errors=True, file=_NullFile) + self.cov.report(ignore_errors=True, file=_NullFile) if annotate_dir: stream.write(f'Coverage annotated source written to dir {annotate_dir}\n') else: @@ -203,49 +186,43 @@ # Produce html report if wanted. if 'html' in self.cov_report: output = self.cov_report['html'] - with _backup(self.cov, 'config'): - total = self.cov.html_report(ignore_errors=True, directory=output) + self.cov.html_report(ignore_errors=True, directory=output) stream.write(f'Coverage HTML written to dir {self.cov.config.html_dir if output is None else output}\n') # Produce xml report if wanted. if 'xml' in self.cov_report: output = self.cov_report['xml'] - with _backup(self.cov, 'config'): - total = self.cov.xml_report(ignore_errors=True, outfile=output) + self.cov.xml_report(ignore_errors=True, outfile=output) stream.write(f'Coverage XML written to file {self.cov.config.xml_output if output is None else output}\n') # Produce json report if wanted if 'json' in self.cov_report: output = self.cov_report['json'] - with _backup(self.cov, 'config'): - total = self.cov.json_report(ignore_errors=True, outfile=output) + self.cov.json_report(ignore_errors=True, outfile=output) stream.write('Coverage JSON written to file %s\n' % (self.cov.config.json_output if output is None else output)) # Produce Markdown report if wanted. if 'markdown' in self.cov_report: output = self.cov_report['markdown'] - with _backup(self.cov, 'config'): - with Path(output).open('w') as output_file: - total = self.cov.report(ignore_errors=True, file=output_file, output_format='markdown') + with Path(output).open('w') as output_file: + self.cov.report(ignore_errors=True, file=output_file, output_format='markdown') stream.write(f'Coverage Markdown information written to file {output}\n') # Produce Markdown report if wanted, appending to output file if 'markdown-append' in self.cov_report: output = self.cov_report['markdown-append'] - with _backup(self.cov, 'config'): - with Path(output).open('a') as output_file: - total = self.cov.report(ignore_errors=True, file=output_file, output_format='markdown') + with Path(output).open('a') as output_file: + self.cov.report(ignore_errors=True, file=output_file, output_format='markdown') stream.write(f'Coverage Markdown information appended to file {output}\n') # Produce lcov report if wanted. if 'lcov' in self.cov_report: output = self.cov_report['lcov'] - with _backup(self.cov, 'config'): - self.cov.lcov_report(ignore_errors=True, outfile=output) + self.cov.lcov_report(ignore_errors=True, outfile=output) - # We need to call Coverage.report here, just to get the total - # Coverage.lcov_report doesn't return any total and we need it for --cov-fail-under. - total = self.cov.report(ignore_errors=True, file=_NullFile) + # We need to call Coverage.report here, just to get the total + # Coverage.lcov_report doesn't return any total and we need it for --cov-fail-under. + self.cov.report(ignore_errors=True, file=_NullFile) stream.write(f'Coverage LCOV written to file {self.cov.config.lcov_output if output is None else output}\n') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/src/pytest_cov/plugin.py new/pytest_cov-7.1.0/src/pytest_cov/plugin.py --- old/pytest_cov-7.0.0/src/pytest_cov/plugin.py 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/src/pytest_cov/plugin.py 2020-02-02 01:00:00.000000000 +0100 @@ -17,7 +17,10 @@ if TYPE_CHECKING: from .engine import CovController +# The message is unescaped if it comes from configuration file, and escaped if +# it comes from command line option (-W) or PYTHONWARNINGS envvar. COVERAGE_SQLITE_WARNING_RE = re.compile('unclosed database in <sqlite3.Connection object at', re.I) +COVERAGE_SQLITE_WARNING_RE2 = re.compile('unclosed\\ database\\ in\\ <sqlite3\\.Connection\\ object\\ at', re.I) def validate_report(arg): @@ -325,7 +328,7 @@ # we add default warning configuration to prevent certain warnings to bubble up as errors due to rigid filterwarnings configuration for _, message, category, _, _ in warnings.filters: - if category is ResourceWarning and message == COVERAGE_SQLITE_WARNING_RE: + if category is ResourceWarning and message in (COVERAGE_SQLITE_WARNING_RE, COVERAGE_SQLITE_WARNING_RE2): break else: warnings.filterwarnings('default', 'unclosed database in <sqlite3.Connection object at', ResourceWarning) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/tests/test_pytest_cov.py new/pytest_cov-7.1.0/tests/test_pytest_cov.py --- old/pytest_cov-7.0.0/tests/test_pytest_cov.py 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/tests/test_pytest_cov.py 2020-02-02 01:00:00.000000000 +0100 @@ -494,6 +494,28 @@ result.stdout.fnmatch_lines(['Required test coverage of 50% reached. Total coverage: *%']) +def test_cov_reporting_bug_641(testdir, monkeypatch): + testdir.tmpdir.mkdir('src').join('foo.py').write('') + testdir.tmpdir.mkdir('tests').join('test_foo.py').write(""" +import foo + +def test_foo(): + pass +""") + testdir.tmpdir.join('.coveragerc').write(""" +[run] +relative_files = True +source = src, tests +""") + monkeypatch.setitem(os.environ, 'PYTHONPATH', os.pathsep.join([os.environ.get('PYTHONPATH', ''), 'src'])) + result = testdir.runpytest('-v', '--cov=src', '--cov-report=xml', '--cov-fail-under=100') + assert result.ret == 0 + result.stdout.fnmatch_lines(['Required test coverage of 100% reached. Total coverage: *%']) + result = testdir.runpytest('-v', '--cov=src', '--cov-report=', '--cov-fail-under=100') + assert result.ret == 0 + result.stdout.fnmatch_lines(['Required test coverage of 100% reached. Total coverage: *%']) + + def test_cov_min_float_value(testdir): script = testdir.makepyfile(SCRIPT) @@ -1435,8 +1457,8 @@ result.stdout.fnmatch_lines(['* 1 passed *']) result.stderr.fnmatch_lines( [ - '* (module-not-measured)', - '* (no-data-collected)', + '* (module-not-measured)*', + '* (no-data-collected)*', '* CovReportWarning: Failed to generate report: No data to report.', ] ) @@ -1965,6 +1987,9 @@ with Path(__file__).parent.joinpath('contextful.py').open() as f: contextful_tests = f.read() script = testdir.makepyfile(contextful_tests) + testdir.tmpdir.join('.coveragerc').write("""[run] +core = ctrace""") + result = testdir.runpytest('-v', f'--cov={script.dirpath()}', '--cov-context=test', script, *opts.split()) assert result.ret == 0 result.stdout.fnmatch_lines( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest_cov-7.0.0/tox.ini new/pytest_cov-7.1.0/tox.ini --- old/pytest_cov-7.0.0/tox.ini 2020-02-02 01:00:00.000000000 +0100 +++ new/pytest_cov-7.1.0/tox.ini 2020-02-02 01:00:00.000000000 +0100 @@ -15,22 +15,12 @@ clean, check, docs, - {py39,py310,py311,py312,py313,pypy39,pypy310,pypy311}-{pytest84}-{xdist38}-{coverage710}, + {py310,py311,py312,py313,py314,pypy310,pypy311}-{pytest90}-{xdist38}-{coverage713}, + {py39,pypy39}-{pytest80}-{xdist38}-{coverage710}, report ignore_basepython_conflict = true [testenv] -basepython = - pypy38: {env:TOXPYTHON:pypy3.8} - pypy39: {env:TOXPYTHON:pypy3.9} - pypy310: {env:TOXPYTHON:pypy3.10} - py38: {env:TOXPYTHON:python3.8} - py39: {env:TOXPYTHON:python3.9} - py310: {env:TOXPYTHON:python3.10} - py311: {env:TOXPYTHON:python3.11} - py312: {env:TOXPYTHON:python3.12} - py313: {env:TOXPYTHON:python3.13} - {bootstrap,clean,check,report,docs}: {env:TOXPYTHON:python3} extras = testing setenv = PYTHONPATH={toxinidir}/tests @@ -43,6 +33,7 @@ pytest82: _DEP_PYTEST=pytest==8.2.2 pytest83: _DEP_PYTEST=pytest==8.3.5 pytest84: _DEP_PYTEST=pytest==8.4.2 + pytest90: _DEP_PYTEST=pytest==9.0.2 xdist32: _DEP_PYTESTXDIST=pytest-xdist==3.2.0 xdist33: _DEP_PYTESTXDIST=pytest-xdist==3.3.1 @@ -61,7 +52,11 @@ coverage77: _DEP_COVERAGE=coverage==7.7.1 coverage78: _DEP_COVERAGE=coverage==7.8.2 coverage79: _DEP_COVERAGE=coverage==7.9.2 - coverage710: _DEP_COVERAGE=coverage==7.10.6 + coverage710: _DEP_COVERAGE=coverage==7.10.7 + coverage711: _DEP_COVERAGE=coverage==7.11.3 + coverage712: _DEP_COVERAGE=coverage==7.12.0 + coverage713: _DEP_COVERAGE=coverage==7.13.5 + # For testing against a coverage.py working tree. coveragedev: _DEP_COVERAGE=-e{env:COVERAGE_HOME} passenv =
