Skip to content

Commit

Permalink
Merge pull request #1102 from globus/reusable-tox-workflow
Browse files Browse the repository at this point in the history
Migrate to the reusable tox workflow
  • Loading branch information
kurtmckee authored Nov 7, 2024
2 parents c007c58 + 8ab0996 commit 0b981a8
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 114 deletions.
90 changes: 0 additions & 90 deletions .github/workflows/build.yaml

This file was deleted.

80 changes: 80 additions & 0 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
name: "🧪 Test"

on:
push:
branches:
- "main"
pull_request: null
# build weekly at 4:00 AM UTC
schedule:
- cron: '0 4 * * 1'

jobs:
test:
name: "${{ matrix.name }}"
strategy:
fail-fast: false
matrix:
# The `include` array below will match against these names
# and add additional keys and values to the JSON object.
name:
- "Linux"
- "macOS"
- "Windows"
- "Quality"

# The `include` array below will also inherit these values,
# which are critical for effective cache-busting.
# The nested list syntax ensures that the full array of values is inherited.
cache-key-hash-files:
-
- "requirements/*/*.txt"
- "pyproject.toml"
- "toxfile.py"

include:
- name: "Linux"
runner: "ubuntu-latest"
cpythons:
- "3.8"
- "3.9"
- "3.10"
- "3.11"
- "3.12"
- "3.13"
tox-post-environments:
- "py3.8-mindeps"
- "coverage_report"

- name: "macOS"
runner: "macos-latest"
cpythons:
- "3.11"
tox-post-environments:
- "coverage_report"

- name: "Windows"
runner: "windows-latest"
cpythons:
- "3.11"
tox-post-environments:
- "coverage_report"

- name: "Quality"
runner: "ubuntu-latest"
cpythons:
- "3.13"
tox-environments:
- "check-min-python-is-tested"
- "mypy"
- "mypy-test"
- "poetry-check"
- "pylint"
- "test-lazy-imports"
- "twine-check"
cache-paths:
- ".mypy_cache/"

uses: "globus/workflows/.github/workflows/tox.yaml@04b4abd6fcb9b4be7263bc9d6994ae2ada220739" # v1.1
with:
config: "${{ toJSON(matrix) }}"
4 changes: 4 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ repos:
rev: 0.6.7
hooks:
- id: alphabetize-codeowners
- repo: https://github.com/rhysd/actionlint
rev: v1.7.4
hooks:
- id: actionlint

# custom local hooks
- repo: local
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ attr = "globus_sdk.__version__"
# non-packaging tool configs follow

[tool.pytest.ini_options]
addopts = "--no-success-flaky-report"
addopts = "--no-success-flaky-report --color=yes"
testpaths = ["tests"]
norecursedirs = ["tests/non-pytest"]
filterwarnings = [
Expand Down
26 changes: 13 additions & 13 deletions scripts/ensure_min_python_is_tested.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,23 +19,23 @@
)
requires_python_version = proc.stdout.decode().strip()

with open(REPO_ROOT / ".github" / "workflows" / "build.yaml") as f:
with open(REPO_ROOT / ".github" / "workflows" / "test.yaml") as f:
workflow = YAML.load(f)
try:
test_mindeps_job = workflow["jobs"]["test-mindeps"]
except KeyError:
raise ValueError("Could not find the test-mindeps job. Perhaps it has moved?")

job_steps = test_mindeps_job["steps"]
for step in job_steps:
if "uses" in step and "actions/setup-python" in step["uses"]:
setup_python_step = step
includes = workflow["jobs"]["test"]["strategy"]["matrix"]["include"]
for include in includes:
if include["name"] == "Linux":
break
else:
raise ValueError("Could not find the setup-python step.")
raise ValueError("Could not find 'Linux' in the test matrix.")

python_version = setup_python_step["with"]["python-version"]
if python_version != requires_python_version:
for environment in include["tox-post-environments"]:
if environment.endswith("-mindeps"):
break
else:
raise ValueError("Could not find a '-mindeps' tox-post-environment.")

python_version, _, _ = environment.partition("-")
if python_version != f"py{requires_python_version}":
print("ERROR: ensure_min_python_is_tested.py failed!")
print(
f"\nPackage data sets 'Requires-Python: >={requires_python_version}', "
Expand Down
20 changes: 10 additions & 10 deletions tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ envlist =
pylint
test-lazy-imports
coverage_clean
py{313,312,311,310,39,38}
py38-mindeps
py{3.13,3.12,3.11,3.10,3.9,3.8}
py3.8-mindeps
coverage_report
docs
minversion = 4.22.0
labels =
freezedeps = freezedeps-print,freezedeps-py{313,312,311,310,39,38}
freezedeps = freezedeps-print,freezedeps-py{3.13,3.12,3.11,3.10,3.9,3.8}

[testenv]
# build a wheel, not a tarball, and use a common env to do it (so that the wheel is shared)
Expand All @@ -23,8 +23,8 @@ deps =
mindeps: -r requirements/py{py_dot_ver}/test-mindeps.txt
commands = coverage run -m pytest {posargs}
depends =
py{313,312,311,310,39,38}{-mindeps,}: coverage_clean, lint
coverage_report: py{313,312,311,310,39,38}{-mindeps,}
py{3.13,3.12,3.11,3.10,3.9,3.8}{-mindeps,}: coverage_clean, lint
coverage_report: py{3.13,3.12,3.11,3.10,3.9,3.8}{-mindeps,}

[testenv:coverage_clean]
dependency_groups = coverage
Expand Down Expand Up @@ -65,7 +65,7 @@ deps = pyright
commands = pyright src/ {posargs}

[testenv:docs]
# force use of py311 for doc builds so that we get the same behaviors as the
# force use of py3.11 for doc builds so that we get the same behaviors as the
# readthedocs doc build
basepython = python3.11
deps = -r requirements/py{py_dot_ver}/docs.txt
Expand Down Expand Up @@ -104,7 +104,7 @@ commands =
python -m dependency_groups typing -o requirements/.typing.in
python -m dependency_groups test-mindeps -o requirements/.test-mindeps.in
python -m dependency_groups docs -o requirements/.docs.in
[testenv:freezedeps-py{313,312,311,310,39,38}]
[testenv:freezedeps-py{3.13,3.12,3.11,3.10,3.9,3.8}]
description = freeze development dependencies using pip-compile
skip_install = true
setenv =
Expand All @@ -116,18 +116,18 @@ commands =
pip-compile --strip-extras -q -U --resolver=backtracking .typing.in -o py{py_dot_ver}/typing.txt

# Minimum dependencies are only tested against the lowest supported Python version.
py38: pip-compile --strip-extras -q -U --resolver=backtracking .test-mindeps.in -o py{py_dot_ver}/test-mindeps.txt
py3.8: pip-compile --strip-extras -q -U --resolver=backtracking .test-mindeps.in -o py{py_dot_ver}/test-mindeps.txt

# The docs requirements are only generated for Python 3.11.
py311: pip-compile --strip-extras -q -U --resolver=backtracking .docs.in -o py{py_dot_ver}/docs.txt
py3.11: pip-compile --strip-extras -q -U --resolver=backtracking .docs.in -o py{py_dot_ver}/docs.txt
depends = freezedeps-print

[testenv:check-min-python-is-tested]
description = Check the Requires-Python metadata against CI config
skip_install = true
deps =
ruamel.yaml<0.18
mddj==0.0.6
mddj==0.0.8
commands = python scripts/ensure_min_python_is_tested.py

[testenv:prepare-release]
Expand Down

0 comments on commit 0b981a8

Please sign in to comment.