From 9f8529953ae2dbfcf124a4e8f745f5710e915271 Mon Sep 17 00:00:00 2001 From: zacharyburnett Date: Wed, 11 Feb 2026 10:39:12 -0500 Subject: [PATCH 1/6] add build and test workflows --- .../.github/workflows/build.yml | 29 +++++++++ .../.github/workflows/tests.yml | 29 +++++++++ .../.github/workflows/tests_extra.yml | 33 ++++++++++ {{ cookiecutter.package_name }}/tox.ini | 62 ++++++++++--------- 4 files changed, 123 insertions(+), 30 deletions(-) create mode 100644 {{ cookiecutter.package_name }}/.github/workflows/build.yml create mode 100644 {{ cookiecutter.package_name }}/.github/workflows/tests.yml create mode 100644 {{ cookiecutter.package_name }}/.github/workflows/tests_extra.yml diff --git a/{{ cookiecutter.package_name }}/.github/workflows/build.yml b/{{ cookiecutter.package_name }}/.github/workflows/build.yml new file mode 100644 index 0000000..8a5d004 --- /dev/null +++ b/{{ cookiecutter.package_name }}/.github/workflows/build.yml @@ -0,0 +1,29 @@ +name: build + +on: + pull_request: + release: + types: + - released + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: +{% if cookiecutter.use_compiled_extensions %} + uses: OpenAstronomy/github-actions-workflows/.github/workflows/publish.yml@v2 + with: + targets: | + - cp3*-manylinux_x86_64 + - cp3*-macosx_x86_64 + - cp3*-macosx_arm64 + sdist: true +{% else %} + uses: OpenAstronomy/github-actions-workflows/.github/workflows/publish_pure_python.yml@v2 +{% endif %} + upload_to_pypi: ${{ (github.event_name == 'release') && (github.event.action == 'released') }} + secrets: + pypi_token: ${{ secrets.PYPI_PASSWORD_STSCI_MAINTAINER }} diff --git a/{{ cookiecutter.package_name }}/.github/workflows/tests.yml b/{{ cookiecutter.package_name }}/.github/workflows/tests.yml new file mode 100644 index 0000000..72bb36b --- /dev/null +++ b/{{ cookiecutter.package_name }}/.github/workflows/tests.yml @@ -0,0 +1,29 @@ +name: tests + +on: + push: + branches: + - main + pull_request: + branches: + - main + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v2 + with: + # run reproducible test environments defined in `tox.ini` + envs: | + - linux: py311-test-oldestdeps-xdist + pytest-results-summary: true + - linux: py311-test-xdist + - linux: py312-test-xdist + - linux: py313-test-xdist + - linux: py3-test-xdist + pytest-results-summary: true + - linux: build-docs diff --git a/{{ cookiecutter.package_name }}/.github/workflows/tests_extra.yml b/{{ cookiecutter.package_name }}/.github/workflows/tests_extra.yml new file mode 100644 index 0000000..fbe6604 --- /dev/null +++ b/{{ cookiecutter.package_name }}/.github/workflows/tests_extra.yml @@ -0,0 +1,33 @@ +name: extra tests + +on: + schedule: + # 6am UTC on Mondays + - cron: '0 6 * * 1' + pull_request: + branches: + - main + types: + - synchronize + - labeled + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + # only run tests if scheduled, started from a pull request with the `run extra tests` label, or started manually + if: github.event_name == 'schedule' || contains(github.event.pull_request.labels.*.name, 'run extra tests') || github.event_name == 'workflow_dispatch' + uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1 + with: + # run reproducible test environments defined in `tox.ini` + envs: | + - macos: py311-oldestdeps-xdist + - macos: py311-xdist + - macos: py312-xdist + - macos: py313-xdist + - macos: py3-xdist + - linux: py3-devdeps-xdist + - macos: py3-devdeps-xdist diff --git a/{{ cookiecutter.package_name }}/tox.ini b/{{ cookiecutter.package_name }}/tox.ini index d262ce1..f28811b 100644 --- a/{{ cookiecutter.package_name }}/tox.ini +++ b/{{ cookiecutter.package_name }}/tox.ini @@ -1,25 +1,22 @@ [tox] -min_version = 4.0 envlist = - py{310,311,312}-test - py10-test-oldestdeps - build_docs + py{311,312,313,3}-test + build-docs +requires = + tox-uv [testenv] -# tox environments are constructed with so-called 'factors' (or terms) -# separated by hyphens, e.g. test-devdeps-cov. Lines below starting with factor: -# will only take effect if that factor is included in the environment name. To -# see a list of example environments that can be run, along with a description, -# run: -# -# tox -l -v -# description = run tests - oldestdeps: with the oldest supported version of key dependencies - -# Pass through the following environment variables which may be needed for the CI + oldestdeps: with oldest supported dependency versions + devdeps: with latest unreleased dependency versions + warnings: treating warnings as errors + cov: with coverage + xdist: in parallel pass_env = + HOME + TOXENV + CODECOV_* # A variable to tell tests we are on a CI system CI # Custom compiler locations (such as ccache) @@ -29,32 +26,37 @@ pass_env = # If the user has set a LC override we should follow it # (note LANG is automatically passed through by tox) LC_ALL - -# Suppress display of matplotlib plots generated during docs build set_env = + devdeps: UV_INDEX = https://pypi.anaconda.org/liberfa/simple https://pypi.anaconda.org/astropy/simple https://pypi.anaconda.org/scientific-python-nightly-wheels/simple + devdeps: UV_INDEX_STRATEGY = unsafe-any-match + # Suppress display of matplotlib plots generated during docs build MPLBACKEND = agg # Run the tests in a temporary directory to make sure that we don't import # the package from the source tree change_dir = .tmp/{envname} - -deps = - oldestdeps: minimum_dependencies - pytest-cov - -# The following indicates which extras_require from setup.cfg will be installed extras = test - +uv_resolution = + oldestdeps: lowest-direct +deps = + devdeps: -r requirements-dev.txt + cov: pytest-cov>=4.1.0 + xdist: pytest-xdist +package = + # necessary so that C extensions are available for import; see https://github.com/spacetelescope/jwst/issues/7386#issuecomment-1344371482 + !pyargs: editable + pyargs: wheel commands_pre = - oldestdeps: minimum_dependencies {{ cookiecutter.module_name }} --filename requirements-min.txt - oldestdeps: pip install -r requirements-min.txt - pip freeze - + {list_dependencies_command} commands = - pytest --pyargs {{ cookiecutter.module_name }} --cov {{ cookiecutter.module_name }} --cov-report xml:coverage.xml --cov-report term-missing {posargs} + pytest \ + cov: --cov {{ cookiecutter.module_name }} --cov-report xml:coverage.xml --cov-report term-missing \ + warnings: -W error \ + xdist: -n auto \ + {posargs} -[testenv:build_docs] +[testenv:build-docs] description = invoke sphinx-build to build the HTML docs change_dir = docs From fcb716b5479f1f99ea43d62ef3adb3dda2c33757 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 11 Feb 2026 16:00:00 +0000 Subject: [PATCH 2/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- {{ cookiecutter.package_name }}/.github/workflows/tests.yml | 2 +- .../.github/workflows/tests_extra.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/{{ cookiecutter.package_name }}/.github/workflows/tests.yml b/{{ cookiecutter.package_name }}/.github/workflows/tests.yml index 72bb36b..eb0eea2 100644 --- a/{{ cookiecutter.package_name }}/.github/workflows/tests.yml +++ b/{{ cookiecutter.package_name }}/.github/workflows/tests.yml @@ -12,7 +12,7 @@ on: concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true - + jobs: test: uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v2 diff --git a/{{ cookiecutter.package_name }}/.github/workflows/tests_extra.yml b/{{ cookiecutter.package_name }}/.github/workflows/tests_extra.yml index fbe6604..cd29409 100644 --- a/{{ cookiecutter.package_name }}/.github/workflows/tests_extra.yml +++ b/{{ cookiecutter.package_name }}/.github/workflows/tests_extra.yml @@ -19,7 +19,7 @@ concurrency: jobs: test: # only run tests if scheduled, started from a pull request with the `run extra tests` label, or started manually - if: github.event_name == 'schedule' || contains(github.event.pull_request.labels.*.name, 'run extra tests') || github.event_name == 'workflow_dispatch' + if: github.event_name == 'schedule' || contains(github.event.pull_request.labels.*.name, 'run extra tests') || github.event_name == 'workflow_dispatch' uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1 with: # run reproducible test environments defined in `tox.ini` From d5f46b3e8339b2b553c3c29a28f023714cf931d7 Mon Sep 17 00:00:00 2001 From: zacharyburnett Date: Wed, 11 Feb 2026 11:03:52 -0500 Subject: [PATCH 3/6] more conditional for tox install --- {{ cookiecutter.package_name }}/tox.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/{{ cookiecutter.package_name }}/tox.ini b/{{ cookiecutter.package_name }}/tox.ini index f28811b..ad33e43 100644 --- a/{{ cookiecutter.package_name }}/tox.ini +++ b/{{ cookiecutter.package_name }}/tox.ini @@ -31,7 +31,6 @@ set_env = devdeps: UV_INDEX_STRATEGY = unsafe-any-match # Suppress display of matplotlib plots generated during docs build MPLBACKEND = agg - # Run the tests in a temporary directory to make sure that we don't import # the package from the source tree change_dir = .tmp/{envname} @@ -43,10 +42,12 @@ deps = devdeps: -r requirements-dev.txt cov: pytest-cov>=4.1.0 xdist: pytest-xdist +{% if cookiecutter.use_compiled_extensions %} package = # necessary so that C extensions are available for import; see https://github.com/spacetelescope/jwst/issues/7386#issuecomment-1344371482 !pyargs: editable pyargs: wheel +{% endif %} commands_pre = {list_dependencies_command} commands = From 20b54fa41fb3c48bf4358563ee2fcd8607f02240 Mon Sep 17 00:00:00 2001 From: zacharyburnett Date: Wed, 11 Feb 2026 11:19:14 -0500 Subject: [PATCH 4/6] fix conditional syntax --- {{ cookiecutter.package_name }}/.github/workflows/build.yml | 4 ++-- {{ cookiecutter.package_name }}/tox.ini | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/{{ cookiecutter.package_name }}/.github/workflows/build.yml b/{{ cookiecutter.package_name }}/.github/workflows/build.yml index 8a5d004..fa9eb54 100644 --- a/{{ cookiecutter.package_name }}/.github/workflows/build.yml +++ b/{{ cookiecutter.package_name }}/.github/workflows/build.yml @@ -13,7 +13,7 @@ concurrency: jobs: build: -{% if cookiecutter.use_compiled_extensions %} +{%- if cookiecutter.use_compiled_extensions %} uses: OpenAstronomy/github-actions-workflows/.github/workflows/publish.yml@v2 with: targets: | @@ -23,7 +23,7 @@ jobs: sdist: true {% else %} uses: OpenAstronomy/github-actions-workflows/.github/workflows/publish_pure_python.yml@v2 -{% endif %} +{% endif -%} upload_to_pypi: ${{ (github.event_name == 'release') && (github.event.action == 'released') }} secrets: pypi_token: ${{ secrets.PYPI_PASSWORD_STSCI_MAINTAINER }} diff --git a/{{ cookiecutter.package_name }}/tox.ini b/{{ cookiecutter.package_name }}/tox.ini index ad33e43..e5518a3 100644 --- a/{{ cookiecutter.package_name }}/tox.ini +++ b/{{ cookiecutter.package_name }}/tox.ini @@ -42,12 +42,12 @@ deps = devdeps: -r requirements-dev.txt cov: pytest-cov>=4.1.0 xdist: pytest-xdist -{% if cookiecutter.use_compiled_extensions %} +{%- if cookiecutter.use_compiled_extensions %} package = # necessary so that C extensions are available for import; see https://github.com/spacetelescope/jwst/issues/7386#issuecomment-1344371482 !pyargs: editable pyargs: wheel -{% endif %} +{% endif -%} commands_pre = {list_dependencies_command} commands = From 216d284c3ccb15af8443ee1fe5125c4983069cb0 Mon Sep 17 00:00:00 2001 From: zacharyburnett Date: Wed, 11 Feb 2026 11:20:57 -0500 Subject: [PATCH 5/6] remove reference to secret --- {{ cookiecutter.package_name }}/.github/workflows/build.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/{{ cookiecutter.package_name }}/.github/workflows/build.yml b/{{ cookiecutter.package_name }}/.github/workflows/build.yml index fa9eb54..7d91745 100644 --- a/{{ cookiecutter.package_name }}/.github/workflows/build.yml +++ b/{{ cookiecutter.package_name }}/.github/workflows/build.yml @@ -25,5 +25,3 @@ jobs: uses: OpenAstronomy/github-actions-workflows/.github/workflows/publish_pure_python.yml@v2 {% endif -%} upload_to_pypi: ${{ (github.event_name == 'release') && (github.event.action == 'released') }} - secrets: - pypi_token: ${{ secrets.PYPI_PASSWORD_STSCI_MAINTAINER }} From 1e804dbbb194ed597a5d08eae929ee29bf299f4d Mon Sep 17 00:00:00 2001 From: zacharyburnett Date: Wed, 11 Feb 2026 11:27:53 -0500 Subject: [PATCH 6/6] update version tag --- .../.github/workflows/tests_extra.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/{{ cookiecutter.package_name }}/.github/workflows/tests_extra.yml b/{{ cookiecutter.package_name }}/.github/workflows/tests_extra.yml index cd29409..bf6a9d3 100644 --- a/{{ cookiecutter.package_name }}/.github/workflows/tests_extra.yml +++ b/{{ cookiecutter.package_name }}/.github/workflows/tests_extra.yml @@ -20,7 +20,7 @@ jobs: test: # only run tests if scheduled, started from a pull request with the `run extra tests` label, or started manually if: github.event_name == 'schedule' || contains(github.event.pull_request.labels.*.name, 'run extra tests') || github.event_name == 'workflow_dispatch' - uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1 + uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v2 with: # run reproducible test environments defined in `tox.ini` envs: |