From f4a28fee19a7ecb0ea49de55d0c32511ac58fb4f Mon Sep 17 00:00:00 2001 From: felix Date: Thu, 23 Nov 2023 17:44:33 +0100 Subject: [PATCH] Remove nox, switch to simpler test workflow. --- .github/workflows/tests.yml | 160 ++++++++---------------------------- noxfile.py | 132 ----------------------------- 2 files changed, 32 insertions(+), 260 deletions(-) delete mode 100644 noxfile.py diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4ba941d..b3947d1 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -6,143 +6,47 @@ on: jobs: tests: - name: ${{ matrix.session }} ${{matrix.python }} / ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - include: - - { python: "3.10", os: "ubuntu-latest", session: "pre-commit" } - # - { python: "3.10", os: "ubuntu-latest", session: "mypy" } - - { python: "3.10", os: "ubuntu-latest", session: "tests" } - - { python: "3.9", os: "ubuntu-latest", session: "tests" } - - { python: "3.10", os: "windows-latest", session: "tests" } - - { python: "3.10", os: "macos-latest", session: "tests" } - # - { python: "3.10", os: "ubuntu-latest", session: "typeguard" } - # - { python: "3.10", os: "ubuntu-latest", session: "xdoctest" } - # - { python: "3.10", os: "ubuntu-latest", session: "docs-build" } - - env: - NOXSESSION: ${{ matrix.session }} - FORCE_COLOR: "1" - PRE_COMMIT_COLOR: "always" - - steps: - - name: Check out the repository - uses: actions/checkout@v4 - - - name: Set up Python ${{ matrix.python }} - uses: actions/setup-python@v4.6.1 - with: - python-version: ${{ matrix.python }} - - - name: Upgrade pip - run: | - pip install --constraint=.github/workflows/constraints.txt pip - pip --version - - - name: Upgrade pip in virtual environments - shell: python - run: | - import os - import pip - - with open(os.environ["GITHUB_ENV"], mode="a") as io: - print(f"VIRTUALENV_PIP={pip.__version__}", file=io) - - - name: Install Poetry - run: | - pipx install --pip-args=--constraint=.github/workflows/constraints.txt poetry - poetry --version - - - name: Install Nox - run: | - pipx install --pip-args=--constraint=.github/workflows/constraints.txt nox - pipx inject --pip-args=--constraint=.github/workflows/constraints.txt nox nox-poetry - nox --version - - - name: Compute pre-commit cache key - if: matrix.session == 'pre-commit' - id: pre-commit-cache - shell: python - run: | - import hashlib - import sys - - python = "py{}.{}".format(*sys.version_info[:2]) - payload = sys.version.encode() + sys.executable.encode() - digest = hashlib.sha256(payload).hexdigest() - result = {{ '"${{ runner.os }}-{}-{}-pre-commit".format(python, digest[:8])' }} - - print("::set-output name=result::{}".format(result)) - - - name: Restore pre-commit cache - uses: actions/cache@v3 - if: matrix.session == 'pre-commit' - with: - path: ~/.cache/pre-commit - key: ${{ steps.pre-commit-cache.outputs.result }}-${{ hashFiles('.pre-commit-config.yaml') }} - restore-keys: | - ${{ steps.pre-commit-cache.outputs.result }} - - - name: Run Nox - run: | - nox --python=${{ matrix.python }} - - - name: Upload coverage data - if: always() && matrix.session == 'tests' - uses: "actions/upload-artifact@v3" - with: - name: coverage-data - path: ".coverage.*" - - - name: Upload documentation - if: matrix.session == 'docs-build' - uses: actions/upload-artifact@v3 - with: - name: docs - path: docs/_build - - coverage: runs-on: ubuntu-latest - needs: tests steps: - name: Check out the repository uses: actions/checkout@v4 - - name: Set up Python + - name: Set up Python 3.10 uses: actions/setup-python@v4.6.1 with: - python-version: "3.10" + python-version: 3.10 - - name: Upgrade pip - run: | - pip install --constraint=.github/workflows/constraints.txt pip - pip --version - - - name: Install Poetry - run: | - pipx install --pip-args=--constraint=.github/workflows/constraints.txt poetry - poetry --version - - - name: Install Nox - run: | - pipx install --pip-args=--constraint=.github/workflows/constraints.txt nox - pipx inject --pip-args=--constraint=.github/workflows/constraints.txt nox nox-poetry - nox --version - - - name: Download coverage data - uses: actions/download-artifact@v3 + - name: Cache poetry install + uses: actions/cache@v2 with: - name: coverage-data + path: ~/.local + key: poetry-1.7.1-0 - - name: Combine coverage data and display human readable report - run: | - nox --session=coverage - - name: Create coverage report - run: | - nox --session=coverage -- xml + - name: Install poetry + uses: snok/install-poetry@v1 + with: + version: 1.7.1 + virtualenvs-create: true + virtualenvs-in-project: true - - name: Upload coverage report - uses: codecov/codecov-action@v3.1.4 + - name: cache deps + id: cache-deps + uses: actions/cache@v2 + with: + path: .venv + key: pydeps-${{ hashFiles('**/poetry.lock') }} + + - run: poetry install --no-interaction --no-root + if: steps.cache-deps.outputs.cache-hit != 'true' + + + # Now install _your_ project. This isn't necessary for many types of projects -- particularly + # things like Django apps don't need this. But it's a good idea since it fully-exercises the + # pyproject.toml and makes that if you add things like console-scripts at some point that + # they'll be installed and working. + - run: poetry install --no-interaction + + # And finally run tests. I'm using pytest and all my pytest config is in my `pyproject.toml` + # so this line is super-simple. But it could be as complex as you need. + - run: poetry run pytest diff --git a/noxfile.py b/noxfile.py deleted file mode 100644 index 957e982..0000000 --- a/noxfile.py +++ /dev/null @@ -1,132 +0,0 @@ -"""Nox sessions.""" -import os -import shutil -import sys -from pathlib import Path -from textwrap import dedent - -import nox - -try: - from nox_poetry import Session, session -except ImportError: - message = f"""\ - Nox failed to import the 'nox-poetry' package. - - Please install it using the following command: - - {sys.executable} -m pip install nox-poetry""" - raise SystemExit(dedent(message)) from None - - -package = "heisskleber" -locations = package, "tests", "docs/conf.py" - -python_versions = ["3.9"] # ["3.10", "3.9", "3.11"] -nox.needs_version = ">= 2021.6.6" -nox.options.sessions = ( - "mypy", - "tests", - "lint", - "typeguard", - "xdoctest", - "docs-build", -) - - -@session(python=python_versions[0]) -def lint(session: Session) -> None: - """Lint using ruff.""" - args = session.posargs or locations - session.install("ruff") - session.run("ruff", *args) - - -@session(python=python_versions) -def mypy(session: Session) -> None: - """Type-check using mypy.""" - args = session.posargs or locations - session.install(".") - session.install("mypy", "pytest") - session.run("mypy", *args) - if not session.posargs: - session.run("mypy", f"--python-executable={sys.executable}", "noxfile.py") - - -@session(python=python_versions) -def tests(session: Session) -> None: - """Run the test suite.""" - session.install(".") - session.install("coverage[toml]", "pytest", "pygments") - try: - session.run("coverage", "run", "--parallel", "-m", "pytest", *session.posargs) - finally: - if session.interactive: - session.notify("coverage", posargs=[]) - - -@session(python=python_versions[0]) -def coverage(session: Session) -> None: - """Produce the coverage report.""" - args = session.posargs or ["report"] - - session.install("coverage[toml]") - - if not session.posargs and any(Path().glob(".coverage.*")): - session.run("coverage", "combine") - - session.run("coverage", *args) - - -@session(python=python_versions[0]) -def typeguard(session: Session) -> None: - """Runtime type checking using Typeguard.""" - session.install(".") - session.install("pytest", "typeguard", "pygments") - session.run("pytest", f"--typeguard-packages={package}", *session.posargs) - - -@session(python=python_versions) -def xdoctest(session: Session) -> None: - """Run examples with xdoctest.""" - if session.posargs: - args = [package, *session.posargs] - else: - args = [f"--modname={package}", "--command=all"] - if "FORCE_COLOR" in os.environ: - args.append("--colored=1") - - session.install(".") - session.install("xdoctest[colors]") - session.run("python", "-m", "xdoctest", *args) - - -@session(name="docs-build", python=python_versions[0]) -def docs_build(session: Session) -> None: - """Build the documentation.""" - args = session.posargs or ["docs", "docs/_build"] - if not session.posargs and "FORCE_COLOR" in os.environ: - args.insert(0, "--color") - - session.install(".") - session.install("sphinx", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "myst-parser") - - build_dir = Path("docs", "_build") - if build_dir.exists(): - shutil.rmtree(build_dir) - - session.run("sphinx-build", *args) - - -@session(python=python_versions[0]) -def docs(session: Session) -> None: - """Build and serve the documentation with live reloading on file changes.""" - args = session.posargs or ["--open-browser", "docs", "docs/_build"] - session.install(".") - session.install("sphinx", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "myst-parser") - - build_dir = Path("docs", "_build") - if build_dir.exists(): - shutil.rmtree(build_dir) - - session.run("sphinx-autobuild", *args)