Skip to content

Commit 3f1516d

Browse files
authored
Copier update (misc version bumps) (#74)
Pull in upstream template changes <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added optional Claude CLI integration support. * Added control over Python version management during setup. * **Chores** * Updated development dependencies and tools to latest versions. * Refreshed pre-commit hook configurations and exclusion patterns. * Updated documentation branding references. * Minor text corrections throughout configuration files. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
1 parent 5882376 commit 3f1516d

24 files changed

+129
-75
lines changed

.copier-answers.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# Changes here will be overwritten by Copier
2-
_commit: v0.0.74
2+
_commit: v0.0.77
33
_src_path: gh:LabAutomationAndScreening/copier-base-template.git
44
description: Copier template for creating Python libraries and executables
5+
install_claude_cli: false
56
python_ci_versions:
67
- 3.12.7
78
- 3.13.2

.devcontainer/devcontainer.json

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
"service": "devcontainer",
44
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
55
"features": {
6-
"ghcr.io/devcontainers/features/aws-cli:1.1.1": {
6+
"ghcr.io/devcontainers/features/aws-cli:1.1.2": {
77
// https://github.com/devcontainers/features/blob/main/src/aws-cli/devcontainer-feature.json
88
// view latest version https://raw.githubusercontent.com/aws/aws-cli/v2/CHANGELOG.rst
9-
"version": "2.27.14"
9+
"version": "2.31.11"
1010
},
1111
"ghcr.io/devcontainers/features/python:1.7.1": {
1212
// https://github.com/devcontainers/features/blob/main/src/python/devcontainer-feature.json
@@ -20,17 +20,18 @@
2020
// Add the IDs of extensions you want installed when the container is created.
2121
"extensions": [
2222
// basic tooling
23-
23+
24+
2425
2526
26-
"github.copilot@1.366.1775",
27-
"github.copilot-chat@0.31.2025090401",
27+
"github.copilot@1.380.1802",
28+
"github.copilot-chat@0.33.2025101401",
2829

2930
// Python
30-
"ms-python.python@2025.13.2025090201",
31-
"ms-python.vscode-pylance@2025.7.102",
31+
"ms-python.python@2025.17.2025100201",
32+
"ms-python.vscode-pylance@2025.8.3",
3233
33-
"charliermarsh.ruff@2025.24.0",
34+
"charliermarsh.ruff@2025.28.0",
3435

3536
// Misc file formats
3637
@@ -44,6 +45,7 @@
4445
"extensions.autoUpdate": false,
4546
"extensions.autoCheckUpdates": false,
4647
"livePreview.portNumber": 3025, // arbitrary not to conflict with default 3000 Nuxt port number
48+
"github.copilot.nextEditSuggestions.allowWhitespaceOnlyChanges": false,
4749
"[python]": {
4850
"editor.formatOnSave": true,
4951
"editor.defaultFormatter": "charliermarsh.ruff"
@@ -61,5 +63,5 @@
6163
"initializeCommand": "sh .devcontainer/initialize-command.sh",
6264
"onCreateCommand": "sh .devcontainer/on-create-command.sh",
6365
"postStartCommand": "sh .devcontainer/post-start-command.sh"
64-
// Devcontainer context hash (do not manually edit this, it's managed by a pre-commit hook): 735908f4 # spellchecker:disable-line
66+
// Devcontainer context hash (do not manually edit this, it's managed by a pre-commit hook): a5dbeab3 # spellchecker:disable-line
6567
}

.devcontainer/install-ci-tooling.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import tempfile
88
from pathlib import Path
99

10-
UV_VERSION = "0.8.22"
11-
PNPM_VERSION = "10.17.1"
10+
UV_VERSION = "0.9.2"
11+
PNPM_VERSION = "10.18.3"
1212
COPIER_VERSION = "9.10.2"
1313
COPIER_TEMPLATE_EXTENSIONS_VERSION = "0.3.3"
1414
PRE_COMMIT_VERSION = "4.3.0"
@@ -36,13 +36,21 @@
3636
default=False,
3737
help="Skip installing the SSM plugin for AWS CLI",
3838
)
39+
_ = parser.add_argument(
40+
"--allow-uv-to-install-python",
41+
action="store_true",
42+
default=False,
43+
help="Allow uv to install new versions of Python on the fly. This is typically only needed when instantiating the copier template.",
44+
)
3945

4046

4147
def main():
4248
args = parser.parse_args(sys.argv[1:])
4349
is_windows = platform.system() == "Windows"
4450
uv_env = dict(os.environ)
45-
uv_env.update({"UV_PYTHON_PREFERENCE": "only-system", "UV_PYTHON": args.python_version})
51+
uv_env.update({"UV_PYTHON": args.python_version})
52+
if not args.allow_uv_to_install_python:
53+
uv_env.update({"UV_PYTHON_PREFERENCE": "only-system"})
4654
uv_path = ((GITHUB_WINDOWS_RUNNER_BIN_PATH + "\\") if is_windows else "") + "uv"
4755
if is_windows:
4856
pwsh = shutil.which("pwsh") or shutil.which("powershell")

.gitignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,6 @@ pytest.log
4444
tests/__coverage__
4545
test/__coverage__
4646
coverage-report-pytest
47-
.pytest_cache/
48-
.mypy_cache/
4947
.coverage
5048
.coverage.*
5149
coverage.xml

.pre-commit-config.yaml

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ repos:
4242

4343
# Reformatting (should generally come before any file format or other checks, because reformatting can change things)
4444
- repo: https://github.com/crate-ci/typos
45-
rev: edb4e206047e89b93ebe08f1a2ccc3d581a70cc7 # frozen: v1
45+
rev: 6573587991823ef75e4d6ca97fe895f45e9f14e4 # frozen: v1
4646
hooks:
4747
- id: typos
4848
exclude: |
@@ -59,6 +59,7 @@ repos:
5959
(?x)^(
6060
.*/vendor_files/.*|
6161
.*tests/.*/__snapshots__/.*|
62+
.*/openapi_codegen/.*|
6263
)$
6364
- id: end-of-file-fixer
6465
# the XML formatter hook doesn't leave a blank line at the end, so excluding XML files from this hook to avoid conflicts
@@ -70,10 +71,12 @@ repos:
7071
template/template/.copier-answers.yml.jinja|
7172
template/.copier-answers.yml.jinja|
7273
.*generated/graphql.ts|
74+
.*/openapi_codegen/.*|
7375
.*tests/.*/__snapshots__/.*|
7476
.devcontainer/devcontainer-lock.json|
7577
.copier-answers.yml|
7678
.*\.xml|
79+
.*\.svg|
7780
.*/vendor_files/.*|
7881
)$
7982
- id: pretty-format-json
@@ -85,6 +88,7 @@ repos:
8588
.*pyrightconfig.json|
8689
.*tsconfig.json|
8790
.*biome.jsonc|
91+
.*/openapi_codegen/.*|
8892
.*tests/.*/__snapshots__/.*|
8993
.*/vendor_files/.*|
9094
)$
@@ -98,6 +102,7 @@ repos:
98102
exclude: |
99103
(?x)^(
100104
.*generated/graphql.ts|
105+
.*/openapi_codegen/.*|
101106
.*/schema.graphql|
102107
.*pyrightconfig\.json|
103108
)$
@@ -124,6 +129,7 @@ repos:
124129
.*.jsonc|
125130
.*/vendor_files/.*|
126131
.*/schema.graphql|
132+
.*/openapi_codegen/.*|
127133
.*generated/graphql.ts|
128134
template/.*|
129135
)$
@@ -148,6 +154,7 @@ repos:
148154
(?x)^(
149155
.*/__snapshots__/.*|
150156
.*/vendor_files/.*|
157+
.*\.svg|
151158
)$
152159
153160
# Invalid File Checks
@@ -170,17 +177,19 @@ repos:
170177
- id: check-yaml
171178
# .copier-answers.yml is an autogenerated YAML file by Copier that throws 'found unhashable key' errors
172179
# Helm charts contain other non-YAML markers that cause errors here. they should be checked with helm-lint instead
180+
# VCRpy cassettes sometimes contain non-YAML markers that cause errors---but they're autogenerated anyway
173181
exclude: |
174182
(?x)^(
175183
.copier-answers.yml|
176-
(.*/helm/.*)|
184+
(.*/?helm/.*)|
185+
(.*/tests/unit/.*/?cassettes/.*)|
177186
)$
178187
- id: check-xml
179188
- id: check-merge-conflict
180189
- id: check-case-conflict
181190

182191
- repo: https://github.com/python-jsonschema/check-jsonschema
183-
rev: 83987cd6ad8943c7f029b500b14aaf82c00a01fa # frozen: 0.34.0
192+
rev: 83b816d020105076daac266dbf6bfed199a2da93 # frozen: 0.34.1
184193
hooks:
185194
- id: check-github-workflows
186195

@@ -234,7 +243,7 @@ repos:
234243
description: Runs hadolint to lint Dockerfiles
235244

236245
- repo: https://github.com/astral-sh/ruff-pre-commit
237-
rev: a113f03edeabb71305f025e6e14bd2cd68660e29 # frozen: v0.13.1
246+
rev: f9351c924055bf6c7b4a4670237d3ce141e9f57c # frozen: v0.14.0
238247
hooks:
239248
- id: ruff
240249
name: ruff-src
@@ -244,6 +253,7 @@ repos:
244253
(?x)^(
245254
.*/graphql_codegen/.*|
246255
.*/openapi_codegen/.*|
256+
template/.*|
247257
)$
248258
- id: ruff
249259
name: ruff-tests
@@ -253,6 +263,7 @@ repos:
253263
(?x)^(
254264
.*/graphql_codegen/.*|
255265
.*/openapi_codegen/.*|
266+
template/.*|
256267
)$
257268
- id: ruff-format
258269
exclude: |
@@ -262,7 +273,7 @@ repos:
262273
)$
263274
264275
- repo: https://github.com/pylint-dev/pylint
265-
rev: 98942ba4126a6fe1657bad77027bcc11016d16da # frozen: v3.3.8
276+
rev: 9a3035053154ba0c3ca3b300d6bc9fa72b95d552 # frozen: v4.0.1
266277
hooks:
267278
- id: pylint
268279
name: pylint

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ By participating in this project, you agree to abide by our [Code of Conduct](./
2727
1. **Fork the repository** on GitHub.
2828

2929
2. **Set up the Dev Container (Recommended Method)**
30-
- Create a Github Codespace (`Code`->`Codespaces` in the Github web console of your cloned repository) OR click on the "Open in Devcontainer" link in the [Readme](./README.md)
30+
- Create a GitHub Codespace (`Code`->`Codespaces` in the GitHub web console of your cloned repository) OR click on the "Open in Devcontainer" link in the [Readme](./README.md)
3131

3232
3. **Make Your Changes**
3333
- Create a branch for your feature or bug fix:

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ To create a new repository using this template:
1010
1. Inside that devcontainer, run `python .devcontainer/install-ci-tooling.py` to install necessary tooling to instantiate the template (you can copy/paste the script from this repo...and you can paste it in the root of the repo if you want)
1111
1. Delete all files currently in the repository. Optional...but makes it easiest to avoid git conflicts.
1212
1. Run copier to instantiate the template: `copier copy --trust gh:LabAutomationAndScreening/copier-python-package-template.git .`
13-
1. Run `python .devcontainer/manual-setup-deps.py --only-create-lock` to generate the lock file(s)
13+
1. Run `python .devcontainer/manual-setup-deps.py --only-create-lock --allow-uv-to-install-python` to generate the lock file(s)
1414
1. Stage all files to prepare for commit (`git add .`)
1515
1. Run `python3 .github/workflows/hash_git_files.py . --for-devcontainer-config-update` to update the hash for your devcontainer file
1616
1. Commit the changes (optional)

_typos.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@ extend-exclude = [
2222
".copier-answers.yml", # this is an autogenerated file, and sometimes the commit sha gets confused as being a word
2323
"**/__snapshots__/**", # Snapshots need to remain static
2424
"**/tests/**/cassettes/**/*.yaml", # URLs and other responses in VCR.py generated files should not be altered
25-
"**/vendor_files/**" # if vendors mispell things, there may be other implications in other parts of their code, just leave vendor files alone
25+
"**/vendor_files/**" # if vendors misspell things, there may be other implications in other parts of their code, just leave vendor files alone
2626
]

copier.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ description:
1111
type: str
1212
help: What is the description of this repository?
1313

14+
install_claude_cli:
15+
type: bool
16+
help: Should the Claude CLI be installed in the devcontainer?
17+
default: no
18+
1419
is_open_source:
1520
type: bool
1621
help: Is this library open source?

extensions/context.py

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,54 +10,55 @@ class ContextUpdater(ContextHook):
1010

1111
@override
1212
def hook(self, context: dict[Any, Any]) -> dict[Any, Any]:
13-
context["uv_version"] = "0.8.22"
14-
context["pnpm_version"] = "10.17.1"
13+
context["uv_version"] = "0.9.2"
14+
context["pnpm_version"] = "10.18.3"
1515
context["pre_commit_version"] = "4.3.0"
16-
context["pyright_version"] = "1.1.405"
16+
context["pyright_version"] = "1.1.406"
1717
context["pytest_version"] = "8.4.2"
1818
context["pytest_randomly_version"] = "4.0.1"
1919
context["pytest_cov_version"] = "7.0.0"
2020
context["copier_version"] = "9.10.2"
2121
context["copier_template_extensions_version"] = "0.3.3"
2222
context["sphinx_version"] = "8.1.3"
23-
context["pulumi_version"] = "3.197.0"
24-
context["pulumi_aws_version"] = "7.7.0"
25-
context["pulumi_aws_native_version"] = "1.33.0"
26-
context["pulumi_command_version"] = "1.1.0"
27-
context["pulumi_github_version"] = "6.7.3"
28-
context["pulumi_okta_version"] = "5.2.0"
29-
context["boto3_version"] = "1.40.41"
23+
context["pulumi_version"] = "3.203.0"
24+
context["pulumi_aws_version"] = "7.8.0"
25+
context["pulumi_aws_native_version"] = "1.37.0"
26+
context["pulumi_command_version"] = "1.1.3"
27+
context["pulumi_github_version"] = "6.7.4"
28+
context["pulumi_okta_version"] = "6.0.0"
29+
context["boto3_version"] = "1.40.51"
3030
context["ephemeral_pulumi_deploy_version"] = "0.0.5"
31-
context["pydantic_version"] = "2.11.7"
31+
context["pydantic_version"] = "2.12.2"
3232
context["pyinstaller_version"] = "6.16.0"
3333
context["setuptools_version"] = "80.7.1"
34-
context["strawberry_graphql_version"] = "0.282.0"
35-
context["fastapi_version"] = "0.118.0"
34+
context["strawberry_graphql_version"] = "0.283.3"
35+
context["fastapi_version"] = "0.119.0"
3636
context["fastapi_offline_version"] = "1.7.4"
3737
context["uvicorn_version"] = "0.37.0"
38-
context["lab_auto_pulumi_version"] = "0.1.16"
38+
context["lab_auto_pulumi_version"] = "0.1.17"
3939
context["ariadne_codegen_version"] = "0.15.2"
40-
context["pytest_mock_version"] = "3.15.0"
40+
context["pytest_mock_version"] = "3.15.1"
4141
context["uuid_utils_version"] = "0.11.0"
42+
context["syrupy_version"] = "5.0.0"
4243

4344
context["node_version"] = "24.7.0"
44-
context["nuxt_ui_version"] = "^4.0.0"
45+
context["nuxt_ui_version"] = "^4.0.1"
4546
context["nuxt_version"] = "^4.1.0"
4647
context["nuxt_icon_version"] = "^2.0.0"
47-
context["typescript_version"] = "^5.8.2"
48-
context["playwright_version"] = "^1.55.0"
48+
context["typescript_version"] = "^5.9.3"
49+
context["playwright_version"] = "^1.56.0"
4950
context["vue_version"] = "^3.5.21"
50-
context["vue_tsc_version"] = "^3.1.0"
51+
context["vue_tsc_version"] = "^3.1.1"
5152
context["vue_devtools_api_version"] = "^8.0.0"
52-
context["vue_router_version"] = "^4.5.1"
53+
context["vue_router_version"] = "^4.6.0"
5354
context["dotenv_cli_version"] = "^10.0.0"
54-
context["faker_version"] = "^10.0.0"
55+
context["faker_version"] = "^10.1.0"
5556
context["vitest_version"] = "^3.2.4"
56-
context["eslint_version"] = "^9.36.0"
57+
context["eslint_version"] = "^9.37.0"
5758
context["nuxt_eslint_version"] = "^1.9.0"
5859
context["zod_version"] = "^4.1.5"
5960
context["zod_from_json_schema_version"] = "^0.5.0"
60-
context["types_node_version"] = "^24.6.0"
61+
context["types_node_version"] = "^24.7.2"
6162
context["nuxt_apollo_version"] = "5.0.0-alpha.15"
6263
context["graphql_codegen_cli_version"] = "^6.0.0"
6364
context["graphql_codegen_typescript_version"] = "^5.0.0"
@@ -68,7 +69,10 @@ def hook(self, context: dict[Any, Any]) -> dict[Any, Any]:
6869
context["nuxt_fonts_version"] = "^0.11.4"
6970
context["nuxtjs_color_mode_version"] = "^3.5.2"
7071
context["vue_test_utils_version"] = "^2.4.6"
71-
context["nuxt_test_utils_version"] = "^3.17.2"
72+
context["nuxt_test_utils_version"] = "3.19.1"
73+
context["vue_eslint_parser_version"] = "^10.1.3"
74+
context["happy_dom_version"] = "^20.0.2"
75+
context["node_kiota_bundle_version"] = "1.0.0-preview.99"
7276

7377
context["gha_checkout"] = "v5.0.0"
7478
context["gha_setup_python"] = "v6.0.0"

0 commit comments

Comments
 (0)