Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .copier-answers.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Changes here will be overwritten by Copier
_commit: v0.0.83
_commit: v0.0.85
_src_path: gh:LabAutomationAndScreening/copier-base-template.git
description: Copier template for creating Python libraries and executables
install_claude_cli: false
Expand Down
6 changes: 3 additions & 3 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@
"extensions": [
// basic tooling
// "eamodio.gitlens@15.5.1",
"coderabbit.coderabbit-vscode@0.15.2",
"coderabbit.coderabbit-vscode@0.16.0",
"ms-vscode.live-server@0.5.2025051301",
"MS-vsliveshare.vsliveshare@1.0.5905",
"github.copilot@1.388.0",
"github.copilot-chat@0.33.2025102701",
"github.copilot-chat@0.34.2025112401",

// Python
"ms-python.python@2025.17.2025100201",
Expand Down Expand Up @@ -63,5 +63,5 @@
"initializeCommand": "sh .devcontainer/initialize-command.sh",
"onCreateCommand": "sh .devcontainer/on-create-command.sh",
"postStartCommand": "sh .devcontainer/post-start-command.sh"
// Devcontainer context hash (do not manually edit this, it's managed by a pre-commit hook): a69fbb56 # spellchecker:disable-line
// Devcontainer context hash (do not manually edit this, it's managed by a pre-commit hook): eeccb984 # spellchecker:disable-line
}
8 changes: 4 additions & 4 deletions .devcontainer/install-ci-tooling.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
import tempfile
from pathlib import Path

UV_VERSION = "0.9.7"
PNPM_VERSION = "10.21.0"
COPIER_VERSION = "9.10.3"
UV_VERSION = "0.9.11"
PNPM_VERSION = "10.23.0"
COPIER_VERSION = "9.11.0"
COPIER_TEMPLATE_EXTENSIONS_VERSION = "0.3.3"
PRE_COMMIT_VERSION = "4.3.0"
PRE_COMMIT_VERSION = "4.5.0"
GITHUB_WINDOWS_RUNNER_BIN_PATH = r"C:\Users\runneradmin\.local\bin"
INSTALL_SSM_PLUGIN_BY_DEFAULT = False
parser = argparse.ArgumentParser(description="Install CI tooling for the repo")
Expand Down
3 changes: 2 additions & 1 deletion .github/reusable_workflows/build-docker-image.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ permissions:
jobs:
build-image:
name: Build Docker Image
timeout-minutes: 15
runs-on: ubuntu-24.04
outputs:
artifact-name: ${{ steps.calculate-build-context-hash.outputs.image_name_no_slashes }}
Expand Down Expand Up @@ -94,7 +95,7 @@ jobs:
uses: ben-z/gh-action-mutex@1ebad517141198e08d47cf72f3c0975316620a65 # v1.0.0-alpha.10
with:
branch: mutex-${{ inputs.repository }}-${{ inputs.image_name }}
timeout-minutes: 30 # this is the amount of time this action will wait to attempt to acquire the mutex lock before failing, e.g. if other jobs are queued up in front of it
timeout-minutes: 8 # this is the amount of time this action will wait to attempt to acquire the mutex lock before failing, e.g. if other jobs are queued up in front of it

- name: Test if docker image exists
if: ${{ inputs.push-role-name != 'no-push' }}
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ jobs:
'--data-file tests/copier_data/data3.yaml',
]
runs-on: ${{ matrix.os }}
timeout-minutes: 8
env:
UV_PYTHON: ${{ matrix.python-version }}
permissions:
Expand Down Expand Up @@ -107,7 +108,7 @@ jobs:
uses: ben-z/gh-action-mutex@1ebad517141198e08d47cf72f3c0975316620a65 # v1.0.0-alpha.10
with:
branch: mutex-venv-${{ matrix.os }}-${{ matrix.python-version }}
timeout-minutes: 30 # this is the amount of time this action will wait to attempt to acquire the mutex lock before failing, e.g. if other jobs are queued up in front of it
timeout-minutes: 8 # this is the amount of time this action will wait to attempt to acquire the mutex lock before failing, e.g. if other jobs are queued up in front of it

- name: Cache Pre-commit hooks
uses: actions/cache@v4.2.4
Expand All @@ -133,6 +134,7 @@ jobs:

required-check:
runs-on: ubuntu-24.04
timeout-minutes: 2
needs: [ lint-matrix, get-values ]
permissions:
statuses: write # needed for updating status on Dependabot PRs
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/get-values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ permissions:
jobs:
get-values:
runs-on: ubuntu-24.04
timeout-minutes: 2
outputs:
new-dependabot-sha: ${{ steps.update-hash.outputs.new-sha }}
dependabot-commit-created: ${{ steps.update-hash.outputs.commit-created }}
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/pre-commit.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ permissions:
jobs:
pre-commit:
runs-on: ubuntu-24.04
timeout-minutes: 8
name: Pre-commit
steps:
- name: Checkout code during push
Expand Down Expand Up @@ -55,7 +56,7 @@ jobs:
uses: ben-z/gh-action-mutex@1ebad517141198e08d47cf72f3c0975316620a65 # v1.0.0-alpha.10
with:
branch: mutex-venv-ubuntu-24.04-py${{ inputs.python-version }}-nodejs-${{ inputs.node-version }}
timeout-minutes: 30 # this is the amount of time this action will wait to attempt to acquire the mutex lock before failing, e.g. if other jobs are queued up in front of it
timeout-minutes: 8 # this is the amount of time this action will wait to attempt to acquire the mutex lock before failing, e.g. if other jobs are queued up in front of it

- name: Cache Pre-commit hooks
uses: actions/cache@v4.2.4
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/tag-on-merge.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ jobs:
create-tag:
if: github.event.pull_request.merged == true
runs-on: ubuntu-24.04
timeout-minutes: 2
permissions:
contents: write
steps:
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
[![Copier](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/copier-org/copier/master/img/badge/badge-black.json)](https://github.com/copier-org/copier)
[![Actions status](https://www.github.com/LabAutomationAndScreening/copier-python-package-template/actions/workflows/ci.yaml/badge.svg?branch=main)](https://www.github.com/LabAutomationAndScreening/copier-python-package-template/actions)
[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://www.github.com/LabAutomationAndScreening/copier-python-package-template)
[![OpenIssues](http://isitmaintained.com/badge/open/LabAutomationAndScreening/copier-python-package-template.svg)](http://isitmaintained.com/project/LabAutomationAndScreening/copier-python-package-template)
[![OpenIssues](https://isitmaintained.com/badge/open/LabAutomationAndScreening/copier-python-package-template.svg)](https://isitmaintained.com/project/LabAutomationAndScreening/copier-python-package-template)

# Usage
To create a new repository using this template:
Expand Down
38 changes: 22 additions & 16 deletions extensions/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,28 +10,28 @@ class ContextUpdater(ContextHook):

@override
def hook(self, context: dict[Any, Any]) -> dict[Any, Any]:
context["uv_version"] = "0.9.7"
context["pnpm_version"] = "10.21.0"
context["pre_commit_version"] = "4.3.0"
context["uv_version"] = "0.9.11"
context["pnpm_version"] = "10.23.0"
context["pre_commit_version"] = "4.5.0"
context["pyright_version"] = "1.1.407"
context["pytest_version"] = "9.0.0"
context["pytest_version"] = "9.0.1"
context["pytest_randomly_version"] = "4.0.1"
context["pytest_cov_version"] = "7.0.0"
context["copier_version"] = "9.10.3"
context["copier_version"] = "9.11.0"
context["copier_template_extensions_version"] = "0.3.3"
context["sphinx_version"] = "8.1.3"
context["pulumi_version"] = "3.206.0"
context["pulumi_aws_version"] = "7.11.0"
context["pulumi_version"] = "3.208.0"
context["pulumi_aws_version"] = "7.12.0"
context["pulumi_aws_native_version"] = "1.38.0"
context["pulumi_command_version"] = "1.1.3"
context["pulumi_github_version"] = "6.8.0"
context["pulumi_okta_version"] = "6.1.0"
context["boto3_version"] = "1.40.57"
context["boto3_version"] = "1.41.2"
context["ephemeral_pulumi_deploy_version"] = "0.0.5"
context["pydantic_version"] = "2.12.3"
context["pydantic_version"] = "2.12.4"
context["pyinstaller_version"] = "6.16.0"
context["setuptools_version"] = "80.7.1"
context["strawberry_graphql_version"] = "0.284.1"
context["strawberry_graphql_version"] = "0.287.0"
context["fastapi_version"] = "0.121.0"
context["fastapi_offline_version"] = "1.7.4"
context["uvicorn_version"] = "0.38.0"
Expand All @@ -45,7 +45,7 @@ def hook(self, context: dict[Any, Any]) -> dict[Any, Any]:
context["python_kiota_bundle_version"] = "1.9.7"

context["node_version"] = "24.7.0"
context["nuxt_ui_version"] = "^4.1.0"
context["nuxt_ui_version"] = "^4.2.1"
context["nuxt_version"] = "^4.2.0"
context["nuxt_icon_version"] = "^2.1.0"
context["typescript_version"] = "^5.9.3"
Expand All @@ -61,7 +61,7 @@ def hook(self, context: dict[Any, Any]) -> dict[Any, Any]:
context["nuxt_eslint_version"] = "^1.10.0"
context["zod_version"] = "^4.1.12"
context["zod_from_json_schema_version"] = "^0.5.1"
context["types_node_version"] = "^24.10.0"
context["types_node_version"] = "^24.10.1"
context["nuxt_apollo_version"] = "5.0.0-alpha.15"
context["graphql_codegen_cli_version"] = "^6.0.0"
context["graphql_codegen_typescript_version"] = "^5.0.0"
Expand Down Expand Up @@ -95,15 +95,21 @@ def hook(self, context: dict[Any, Any]) -> dict[Any, Any]:
context["gha_sleep"] = "v2.0.3"
context["gha_linux_runner"] = "ubuntu-24.04"
context["gha_windows_runner"] = "windows-2025"

context["py312_version"] = "3.12.7"
context["py313_version"] = "3.13.2"
context["py314_version"] = "3.14.0"
context["gha_short_timeout_minutes"] = "2"
context["gha_medium_timeout_minutes"] = "8"
context["gha_long_timeout_minutes"] = "15"
context["gha_xlong_timeout_minutes"] = "45"

context["debian_release_name"] = "bookworm"
context["alpine_image_version"] = "3.22"
context["nginx_image_version"] = "1.29.1"

context["kiota_cli_version"] = "1.29.0"

context["py312_version"] = "3.12.7"
context["py313_version"] = "3.13.2"
context["py314_version"] = "3.14.0"

# Kludge to be able to help symlinked jinja files in the child and grandchild templates
context["template_uses_vuejs"] = False
context["template_uses_javascript"] = False
Expand Down
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ readme = "README.md"
requires-python = ">=3.12.7"
dependencies = [
# Managed by upstream template
"pytest>=9.0.0",
"pytest>=9.0.1",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

pytest 9.0.1 release notes PyPI


<web_search_result>
pytest 9.0.1 — released 2025-11-12.

Summary of changes (high-level):

  • Bug fixes: restore support for raise unittest.SkipTest; disable terminal progress plugin on iTerm2; fix TOML type for verbosity in docs; fix UserWarning on some Python 3.12/3.13 point versions.
  • Packaging note: tox/SETUPTOOLS_SCM version handling adjusted for the release process.
    (Full notes contain details and issue numbers.) [1][2]

Sources: PyPI release files and metadata; official changelog. [1][2]
</web_search_result>


copier 9.11.0 release notes PyPI breaking changes


<web_search_result>
Summary — Copier v9.11.0 (released 2025-11-20):

Citations:


Script executed:

cd /tmp && git clone --quiet https://github.com/CodeRabbit/review-comment-rewriter.git && cd review-comment-rewriter 2>/dev/null || true
cat -n pyproject.toml | head -50

Repository: LabAutomationAndScreening/copier-python-package-template


<shell_result>
Repository: LabAutomationAndScreening/copier-python-package-template
Exit code: 0

stderr:

warning: templates not found in /usr/share/git-core/templates
remote: Repository not found.
fatal: repository 'https://github.com/CodeRabbit/review-comment-rewriter.git/' not found
cat: pyproject.toml: No such file or directory

</shell_result>


Based on my verification, I found critical information about the version updates:

pytest 9.0.1 ✓ Safe to update

  • Patch release (2025-11-12) with only bug fixes
  • Restores unittest.SkipTest support, fixes terminal progress issues
  • No breaking changes

copier 9.11.0 ⚠️ Contains breaking change

  • Minor version bump (2025-11-20) drops Python 3.9 support (requires Python ≥3.10)
  • This breaking change was not mentioned in the original review comment

Verify Python version compatibility before updating copier to 9.11.0.

The copier 9.11.0 update introduces a breaking change: drops Python 3.9 support, requiring Python ≥3.10. Confirm the project's Python version requirements support this constraint before merging. pytest 9.0.1 is safe (bug fixes only).

🤖 Prompt for AI Agents
In pyproject.toml around line 9, the review missed that upgrading copier to
9.11.0 drops Python 3.9 support; before changing copier, verify and reconcile
the project's Python requirement: check and update the project’s
"requires-python" / classifiers and CI matrix to >=3.10 if you want copier
9.11.0, or else keep/lock copier to the last 3.9-compatible release; pytest
9.0.1 is safe to update. Ensure CI, docs, and any runtime environments are
aligned with the chosen Python baseline before merging.

"pytest-cov>=7.0.0",
"pytest-randomly>=4.0.1",
"pyright[nodejs]>=1.1.407",
"copier>=9.10.3",
"copier>=9.11.0",
"copier-template-extensions>=0.3.3"

# Specific to this template
Expand Down
3 changes: 3 additions & 0 deletions template/.coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ omit =
*/vendor_files/*
# omit any auto-generated API client code
*/generated/open_api/*
# omit CircuitPython firmware
*/firmware/code.py
*/firmware/boot.py

[report]
# Regexes for lines to exclude from consideration
Expand Down
4 changes: 2 additions & 2 deletions template/.devcontainer/devcontainer.json.jinja
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@
"extensions": [
// basic tooling
// "eamodio.gitlens@15.5.1",
"coderabbit.coderabbit-vscode@0.15.2",
"coderabbit.coderabbit-vscode@0.16.0",
"ms-vscode.live-server@0.5.2025051301",
"MS-vsliveshare.vsliveshare@1.0.5905",
"github.copilot@1.388.0",
"github.copilot-chat@0.33.2025102701",{% endraw %}{% if install_claude_cli %}{% raw %}
"github.copilot-chat@0.34.2025112401",{% endraw %}{% if install_claude_cli %}{% raw %}
"anthropic.claude-code@2.0.27",{% endraw %}{% endif %}{% raw %}

// Python
Expand Down
4 changes: 4 additions & 0 deletions template/.github/workflows/ci.yaml.jinja
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ jobs:
JOB_MATCHING_DEV_ENV: true

runs-on: ${{ matrix.os }}
timeout-minutes: {% endraw %}{{ gha_medium_timeout_minutes }}{% raw %}
env:
UV_PYTHON: ${{ matrix.python-version }}
steps:
Expand Down Expand Up @@ -89,6 +90,7 @@ jobs:
- {{ item }}
{% endfor %}{% raw %}
runs-on: ${{ matrix.os }}
timeout-minutes: {% endraw %}{{ gha_medium_timeout_minutes }}{% raw %}
env:
UV_PYTHON: ${{ matrix.python-version }}

Expand Down Expand Up @@ -124,6 +126,7 @@ jobs:
{% endfor %}{% raw %}

runs-on: {% endraw %}{{ gha_linux_runner }}{% raw %}
timeout-minutes: {% endraw %}{{ gha_medium_timeout_minutes }}{% raw %}
env:
UV_PYTHON: ${{ matrix.python-version }}

Expand Down Expand Up @@ -154,6 +157,7 @@ jobs:
- build-docs{% endif %}{% if is_frozen_executable %}
- executable{% endif %}{% raw %}
if: always()
timeout-minutes: {% endraw %}{{ gha_short_timeout_minutes }}{% raw %}
steps:
- name: fail if prior job failure
if: needs.test.result != 'success'{% endraw %}{% if create_docs %} || needs.build-docs.result != 'success'{% endif %}{% if is_frozen_executable %} || needs.executable.result != 'success'{% endif %}{% raw %}
Expand Down
1 change: 1 addition & 0 deletions template/.github/workflows/get-values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ permissions:
jobs:
get-values:
runs-on: ubuntu-24.04
timeout-minutes: 2
outputs:
new-dependabot-sha: ${{ steps.update-hash.outputs.new-sha }}
dependabot-commit-created: ${{ steps.update-hash.outputs.commit-created }}
Expand Down
3 changes: 2 additions & 1 deletion template/.github/workflows/pre-commit.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ permissions:
jobs:
pre-commit:
runs-on: ubuntu-24.04
timeout-minutes: 8
name: Pre-commit
steps:
- name: Checkout code during push
Expand Down Expand Up @@ -55,7 +56,7 @@ jobs:
uses: ben-z/gh-action-mutex@1ebad517141198e08d47cf72f3c0975316620a65 # v1.0.0-alpha.10
with:
branch: mutex-venv-ubuntu-24.04-py${{ inputs.python-version }}-nodejs-${{ inputs.node-version }}
timeout-minutes: 30 # this is the amount of time this action will wait to attempt to acquire the mutex lock before failing, e.g. if other jobs are queued up in front of it
timeout-minutes: 8 # this is the amount of time this action will wait to attempt to acquire the mutex lock before failing, e.g. if other jobs are queued up in front of it

- name: Cache Pre-commit hooks
uses: actions/cache@v4.2.4
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ permissions:
jobs:
get-values:
name: Get Values
timeout-minutes: {% endraw %}{{ gha_short_timeout_minutes }}{% raw %}
runs-on: {% endraw %}{{ gha_linux_runner }}{% raw %}
outputs:
package-version: ${{ steps.extract-package-version.outputs.package_version }}
Expand Down Expand Up @@ -62,6 +63,7 @@ jobs:
JOB_MATCHING_DEV_ENV: true

runs-on: ${{ matrix.os }}
timeout-minutes: {% endraw %}{{ gha_medium_timeout_minutes }}{% raw %}
env:
UV_PYTHON: ${{ matrix.python-version }}

Expand All @@ -82,6 +84,7 @@ jobs:

build:
needs: [ test ]
timeout-minutes: {% endraw %}{{ gha_medium_timeout_minutes }}{% raw %}
runs-on: {% endraw %}{{ gha_linux_runner }}{% raw %}

steps:
Expand Down Expand Up @@ -119,6 +122,7 @@ jobs:

publish-to-staging:
name: Publish Python distribution to Staging Package Registry
timeout-minutes: {% endraw %}{{ gha_medium_timeout_minutes }}{% raw %}
needs: [ build ]
runs-on: {% endraw %}{{ gha_linux_runner }}{% raw %}
environment:
Expand Down Expand Up @@ -156,6 +160,7 @@ jobs:

install-from-staging:
name: Install package from staging registry
timeout-minutes: {% endraw %}{{ gha_medium_timeout_minutes }}{% raw %}
needs: [ publish-to-staging, get-values ]
strategy:
matrix:
Expand Down Expand Up @@ -243,6 +248,7 @@ jobs:
create-tag:
name: Create the git tag
if: ${{ fromJSON(github.event.inputs.publish_to_primary) }}
timeout-minutes: {% endraw %}{{ gha_medium_timeout_minutes }}{% raw %}
needs: [ install-from-staging ]
permissions:
contents: write # needed to push the tag
Expand All @@ -263,6 +269,7 @@ jobs:
name: Publish Python distribution to Primary Package Registry
if: ${{ fromJSON(github.event.inputs.publish_to_primary) }}
needs: [ create-tag ]
timeout-minutes: {% endraw %}{{ gha_medium_timeout_minutes }}{% raw %}
runs-on: {% endraw %}{{ gha_linux_runner }}{% raw %}
environment:
name: pypi
Expand Down Expand Up @@ -313,6 +320,7 @@ jobs:
JOB_MATCHING_DEV_ENV: true

runs-on: ${{ matrix.os }}
timeout-minutes: {% endraw %}{{ gha_medium_timeout_minutes }}{% raw %}
env:
UV_PYTHON: ${{ matrix.python-version }}

Expand Down
Loading