From 911b8002ebc4861c2c2bcdff93359ab81d1195a6 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Fri, 23 Feb 2024 09:15:25 -0500 Subject: [PATCH] ci: fix coverage combine for different OS's (#778) * ci: fix coverage combine for different OS's Signed-off-by: Henry Schreiner * tests: remove some coverage ignore pragmas Signed-off-by: Henry Schreiner * ci: manually ignore broken path on Windows Signed-off-by: Henry Schreiner * ci: try to fix paths again Signed-off-by: Henry Schreiner * WIP: add some debugging info Signed-off-by: Henry Schreiner * WIP: fixup Signed-off-by: Henry Schreiner * WIP: try non-editable install Signed-off-by: Henry Schreiner * ci: use module vs. path Signed-off-by: Henry Schreiner * ci: require proper version of coverage Signed-off-by: Henry Schreiner * ci: drop relative paths Signed-off-by: Henry Schreiner * ci: editable install with non-rel paths Signed-off-by: Henry Schreiner * ci: clean up changes Signed-off-by: Henry Schreiner * ci: try adding sources for coverage Signed-off-by: Henry Schreiner * ci: try manually fixing the coverage files on Windows Signed-off-by: Henry Schreiner * ci: try omit instead of changing the sqlite file Signed-off-by: Henry Schreiner * revert: previous commit --------- Signed-off-by: Henry Schreiner --- nox/_version.py | 4 ++-- nox/command.py | 6 +++--- nox/logger.py | 8 ++------ noxfile.py | 19 +++++++++++++++---- pyproject.toml | 3 ++- requirements-test.txt | 1 + 6 files changed, 25 insertions(+), 16 deletions(-) diff --git a/nox/_version.py b/nox/_version.py index 10b42c6e..261a298e 100644 --- a/nox/_version.py +++ b/nox/_version.py @@ -21,9 +21,9 @@ from packaging.specifiers import InvalidSpecifier, SpecifierSet from packaging.version import InvalidVersion, Version -if sys.version_info >= (3, 8): # pragma: no cover +if sys.version_info >= (3, 8): import importlib.metadata as metadata -else: # pragma: no cover +else: import importlib_metadata as metadata diff --git a/nox/command.py b/nox/command.py index 3215772e..b1f544de 100644 --- a/nox/command.py +++ b/nox/command.py @@ -24,9 +24,9 @@ from nox.logger import logger from nox.popen import popen -if sys.version_info < (3, 8): # pragma: no cover +if sys.version_info < (3, 8): from typing_extensions import Literal -else: # pragma: no cover +else: from typing import Literal ExternalType = Literal["error", True, False] @@ -62,7 +62,7 @@ def _clean_env(env: Mapping[str, str] | None = None) -> dict[str, str] | None: clean_env: dict[str, str] = {} # Ensure systemroot is passed down, otherwise Windows will explode. - if sys.platform == "win32": # pragma: no cover + if sys.platform == "win32": clean_env["SYSTEMROOT"] = os.environ.get("SYSTEMROOT", "") clean_env.update(env) diff --git a/nox/logger.py b/nox/logger.py index 8743adb7..f98d8033 100644 --- a/nox/logger.py +++ b/nox/logger.py @@ -80,16 +80,12 @@ def __init__(self, name: str, level: int = logging.NOTSET): logging.addLevelName(OUTPUT, "OUTPUT") def success(self, msg: str, *args: Any, **kwargs: Any) -> None: - if self.isEnabledFor(SUCCESS): + if self.isEnabledFor(SUCCESS): # pragma: no cover self._log(SUCCESS, msg, args, **kwargs) - else: # pragma: no cover - pass def output(self, msg: str, *args: Any, **kwargs: Any) -> None: - if self.isEnabledFor(OUTPUT): + if self.isEnabledFor(OUTPUT): # pragma: no cover self._log(OUTPUT, msg, args, **kwargs) - else: # pragma: no cover - pass logging.setLoggerClass(LoggerWithSuccessAndOutput) diff --git a/noxfile.py b/noxfile.py index fa10e1f5..3fdcbaa2 100644 --- a/noxfile.py +++ b/noxfile.py @@ -15,10 +15,12 @@ from __future__ import annotations +import contextlib import functools import os import platform import shutil +import sqlite3 import sys import nox @@ -49,23 +51,32 @@ def tests(session: nox.Session, tox_version: str) -> None: if session.python == "3.7" and tox_version == "latest": return + coverage_file = ( + f".coverage.{sys.platform}.{session.python}.tox{tox_version.lstrip('<')}" + ) + session.create_tmp() # Fixes permission errors on Windows session.install("-r", "requirements-test.txt") - session.install("-e", ".[tox_to_nox]") + session.install("-e.[tox_to_nox]") if tox_version != "latest": session.install(f"tox{tox_version}") session.run( "pytest", - "--cov=nox", + "--cov", "--cov-config", "pyproject.toml", "--cov-report=", *session.posargs, env={ - "COVERAGE_FILE": f".coverage.{session.python}.tox.{tox_version.lstrip('<')}" + "COVERAGE_FILE": coverage_file, }, ) + if sys.platform.startswith("win"): + with contextlib.closing(sqlite3.connect(coverage_file)) as con, con: + con.execute("UPDATE file SET path = REPLACE(path, '\\', '/')") + con.execute("DELETE FROM file WHERE SUBSTR(path, 2, 1) == ':'") + @nox.session(python=["3.7", "3.8", "3.9", "3.10"], venv_backend="conda") def conda_tests(session: nox.Session) -> None: @@ -84,7 +95,7 @@ def cover(session: nox.Session) -> None: if ON_WINDOWS_CI: return - session.install("coverage[toml]") + session.install("coverage[toml]>=5.3") session.run("coverage", "combine") session.run("coverage", "report", "--fail-under=100", "--show-missing") session.run("coverage", "erase") diff --git a/pyproject.toml b/pyproject.toml index 32f5b9e5..e7cda194 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -98,8 +98,9 @@ testpaths = [ "tests" ] [tool.coverage.run] branch = true -relative_files = true omit = [ "nox/_typing.py" ] +relative_files = true +source_pkgs = [ "nox" ] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "if TYPE_CHECKING:", "@overload" ] diff --git a/requirements-test.txt b/requirements-test.txt index c4c2ba52..9886e7a0 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,3 +1,4 @@ +coverage[toml]>=5.3 flask myst-parser pytest>=6.0