From: Mike Bayer Date: Sun, 19 Oct 2025 19:08:20 +0000 (-0400) Subject: refactor common reporting options a bit X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e3df59771019b7ca0824eee2f42c3791b607eea9;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git refactor common reporting options a bit Change-Id: I4a7316867ceacabc4e641017c9f19e40fababdbe --- diff --git a/noxfile.py b/noxfile.py index 18bee7ee35..6b593b06fb 100644 --- a/noxfile.py +++ b/noxfile.py @@ -15,7 +15,7 @@ nox.needs_version = ">=2025.10.16" if True: sys.path.insert(0, ".") - from tools.toxnox import extract_opts + from tools.toxnox import apply_pytest_opts from tools.toxnox import tox_parameters @@ -191,7 +191,6 @@ def _tests( platform_intensive: bool = False, timing_intensive: bool = True, coverage: bool = False, - mypy: bool = False, ) -> None: # PYTHONNOUSERSITE - this *MUST* be set so that the ./lib/ import # set up explicitly in test/conftest.py is *disabled*, so that @@ -219,9 +218,6 @@ def _tests( includes_excludes: dict[str, list[str]] = {"k": [], "m": []} - has_greenlet = "greenlet" if greenlet else "nogreenlet" - file_suffix = f"{database}-{cext}-{has_greenlet}" - if coverage: timing_intensive = False @@ -250,31 +246,11 @@ def _tests( cmd = ["python", "-m", "pytest"] - if coverage: - assert not platform_intensive - has_greenlet = "greenlet" if greenlet else "nogreenlet" - - session.env["COVERAGE_FILE"] = coverage_file = ( - f".coverage.{file_suffix}" - ) - if os.path.exists(coverage_file): - os.unlink(coverage_file) - cmd.extend( - [ - "--cov=sqlalchemy", - "--cov-append", - "--cov-report", - "term", - "--cov-report", - f"xml:coverage-{file_suffix}.xml", - ], - ) - session.log(f"Will store coverage data in {coverage_file}") - includes_excludes["k"].append("not aaa_profiling") - cmd.extend(os.environ.get("TOX_WORKERS", "-n4").split()) if coverage: + assert not platform_intensive + includes_excludes["k"].append("not aaa_profiling") session.install("-e", ".") session.install(*nox.project.dependency_groups(pyproject, "coverage")) else: @@ -298,32 +274,33 @@ def _tests( if collection: cmd.extend([f"-{letter}", " and ".join(collection)]) - posargs, opts = extract_opts(session.posargs, "generate-junit", "dry-run") - - if opts.generate_junit: - has_greenlet = "greenlet" if greenlet else "nogreenlet" - - # produce individual junit files that are per-database - junitfile = f"junit-{file_suffix}.xml" - cmd.extend(["--junitxml", junitfile]) + posargs = apply_pytest_opts( + session, + "sqlalchemy", + [ + database, + cext, + "_greenlet" if greenlet else "nogreenlet", + "memusage" if platform_intensive else "_nomemusage", + "backendonly" if backendonly else "_notbackendonly", + ], + coverage=coverage, + ) if database in ["oracle", "mssql", "sqlite_file"]: cmd.extend(["--write-idents", "db_idents.txt"]) cmd.extend(posargs) - if opts.dry_run: - print(f"DRY RUN: command is: \n{' '.join(cmd)}") - return - try: session.run(*cmd) finally: # Run cleanup for oracle/mssql - if database in ["oracle", "mssql", "sqlite_file"]: - if os.path.exists("db_idents.txt"): - session.run("python", "reap_dbs.py", "db_idents.txt") - os.unlink("db_idents.txt") + if database in ["oracle", "mssql", "sqlite_file"] and os.path.exists( + "db_idents.txt" + ): + session.run("python", "reap_dbs.py", "db_idents.txt") + os.unlink("db_idents.txt") @nox.session(name="pep484") @@ -349,13 +326,13 @@ def test_mypy(session: nox.Session) -> None: session.install("-e", ".") - posargs, opts = extract_opts(session.posargs, "generate-junit") + posargs = apply_pytest_opts( + session, + "sqlalchemy", + ["mypy"], + ) cmd = ["pytest", "-m", "mypy"] - if opts.generate_junit: - # produce individual junit files that are per-database - junitfile = "junit-mypy.xml" - cmd.extend(["--junitxml", junitfile]) session.run(*cmd, *posargs) diff --git a/tools/toxnox.py b/tools/toxnox.py index 891fc70f9c..64bd298df5 100644 --- a/tools/toxnox.py +++ b/tools/toxnox.py @@ -11,6 +11,7 @@ would fall back to defaults. from __future__ import annotations import collections +import os import re import sys from typing import Any @@ -204,3 +205,44 @@ def extract_opts(posargs: list[str], *args: str) -> tuple[list[str], Any]: return [arg for arg in posargs if not extract(arg)], return_tuple( *return_args ) + + +def apply_pytest_opts( + session: nox.Session, + cov: str, + tokens: list[str], + *, + coverage: bool = False, +) -> list[str]: + posargs, opts = extract_opts(session.posargs, "generate-junit") + + file_suffix = "-".join(t for t in tokens if not t.startswith("_")) + + if coverage: + + session.env["COVERAGE_FILE"] = coverage_file = ( + f".coverage.{file_suffix}" + ) + coverage_xml_file = f"coverage-{file_suffix}.xml" + + if os.path.exists(coverage_file): + os.unlink(coverage_file) + posargs.extend( + [ + f"--cov={cov}", + "--cov-append", + "--cov-report", + "term", + "--cov-report", + f"xml:{coverage_xml_file}", + ], + ) + session.log(f"Will store coverage data in {coverage_file}") + session.log(f"Will write xml coverage data to {coverage_xml_file}") + + if opts.generate_junit: + junitfile = f"junit-{file_suffix}.xml" + session.log(f"Will store junit xml in {junitfile}") + posargs.extend(["--junitxml", junitfile]) + + return posargs