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
# e.g. TOX_POSTGRESQL, TOX_MYSQL, etc.
dburl_env = f"TOX_{basename.upper()}"
- # e.g. --db postgresql, --db mysql, etc.
- default_dburl = f"--db {basename}"
+ # e.g. --db=postgresql, --db=mysql, etc.
+ default_dburl = f"--db={basename}"
cmd.extend(os.environ.get(dburl_env, default_dburl).split())
# set up extra drivers using --dbdriver. this first looks in
if greenlet:
dbdrivers.update(extra_drivers["greenlet"])
- for dbdriver in dbdrivers:
- cmd.extend(["--dbdriver", dbdriver])
+ # use equals sign so that we avoid
+ # https://github.com/pytest-dev/pytest/issues/13913
+ cmd.extend([f"--dbdriver={dbdriver}" for dbdriver in dbdrivers])
pyproject = nox.project.load_toml("pyproject.toml")
platform_intensive: bool = False,
timing_intensive: bool = True,
coverage: bool = False,
- mypy: bool = False,
) -> None:
# ensure external PYTHONPATH not interfering
cmd = ["python", "-m", "pytest"]
- if coverage:
- assert not platform_intensive
- cmd.extend(
- [
- "--cov=sqlalchemy",
- "--cov-append",
- "--cov-report",
- "term",
- "--cov-report",
- "xml",
- ],
- )
- 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:
if collection:
cmd.extend([f"-{letter}", " and ".join(collection)])
- posargs, opts = extract_opts(session.posargs, "generate-junit", "dry-run")
-
- if opts.generate_junit:
- # produce individual junit files that are per-database
- junitfile = f"junit-{database}.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"])
+ # use equals sign so that we avoid
+ # https://github.com/pytest-dev/pytest/issues/13913
+ 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")
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)
"setup.py doc/build/conf.py",
"flake8 --extend-ignore='' ./lib/sqlalchemy/ext/asyncio "
"./lib/sqlalchemy/orm/scoping.py",
- "black --check ./lib/ ./test/ ./examples/ setup.py doc/build/conf.py "
- "noxfile.py",
- # test with cython and without cython exts running
+ "black --check ./lib/ ./test/ ./examples/ setup.py doc/build/conf.py",
"slotscheck -m sqlalchemy",
- "env DISABLE_SQLALCHEMY_CEXT_RUNTIME=1 slotscheck -m sqlalchemy",
"python ./tools/format_docs_code.py --check",
"python ./tools/generate_tuple_map_overloads.py --check",
"python ./tools/generate_proxy_methods.py --check",
"python ./tools/walk_packages.py",
]:
- session.run(*cmd.split(), external=True)
+ session.run(*cmd.split())
from __future__ import annotations
import collections
+import os
import re
import sys
from typing import 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")
+
+ if session.python and isinstance(session.python, str):
+ python_token = session.python.replace(".", "")
+ tokens.insert(0, python_token)
+
+ 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