noxfile.py (101 lines of code) (raw):

# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from __future__ import absolute_import import os import nox BLACK_VERSION = "black==23.12.1" ISORT_VERSION = "isort==5.13.2" LINT_PATHS = ["google", "tests", "noxfile.py"] SYSTEM_TEST_PYTHON_VERSIONS = ["3.9", "3.10", "3.11", "3.12", "3.13"] UNIT_TEST_PYTHON_VERSIONS = ["3.9", "3.10", "3.11", "3.12", "3.13"] @nox.session def lint(session): """Run linters. Returns a failure if the linters find linting errors or sufficiently serious code quality issues. """ session.install("-r", "requirements-test.txt") session.install("-r", "requirements.txt") session.install( "flake8", "flake8-annotations", "mypy", BLACK_VERSION, ISORT_VERSION, "build", "twine", ) session.run( "isort", "--fss", "--check-only", "--diff", "--profile=google", *LINT_PATHS, ) session.run( "black", "--check", "--diff", *LINT_PATHS, ) session.run( "flake8", "google", "tests", ) session.run( "mypy", "-p", "google", "--install-types", "--non-interactive", "--show-traceback", ) # verify that pyproject.toml is valid session.run("python", "-m", "build", "--sdist") session.run("twine", "check", "--strict", "dist/*") @nox.session def blacken(session): """Run black. Format code to uniform standard. """ session.install(BLACK_VERSION) session.run( "black", *LINT_PATHS, ) @nox.session() def format(session): """ Run isort to sort imports. Then run black to format code to uniform standard. """ session.install(BLACK_VERSION, ISORT_VERSION) # Use the --fss option to sort imports using strict alphabetical order. # See https://pycqa.github.io/isort/docs/configuration/options.html#force-sort-within-sectionss session.run( "isort", "--fss", "--profile=google", *LINT_PATHS, ) session.run( "black", *LINT_PATHS, ) @nox.session() def cover(session): """Run the final coverage report. This outputs the coverage report aggregating coverage from the unit test runs (not system test runs), and then erases coverage data. """ session.install("coverage", "pytest-cov") session.run("coverage", "report", "--show-missing", "--fail-under=0") session.run("coverage", "erase") def default(session, path): # Install all test dependencies, then install this package in-place. session.install("-r", "requirements-test.txt") session.install(".") session.install("-r", "requirements.txt") # Run pytest with coverage. # Using the coverage command instead of `pytest --cov`, because # `pytest ---cov` causes the module to be initialized twice, which returns # this error: "ImportError: PyO3 modules compiled for CPython 3.8 or older # may only be initialized once per interpreter process". More info about # this is stated here: https://github.com/pytest-dev/pytest-cov/issues/614. session.run( "coverage", "run", "--include=*/google/cloud/alloydb/connector/*.py", "-m", "pytest", "-v", path, *session.posargs, ) session.run( "coverage", "xml", "-o", "sponge_log.xml", ) @nox.session(python=UNIT_TEST_PYTHON_VERSIONS) def unit(session): """Run the unit test suite.""" default(session, os.path.join("tests", "unit")) @nox.session(python=SYSTEM_TEST_PYTHON_VERSIONS) def system(session): default(session, os.path.join("tests", "system"))