From fab3a97f57e6df1f2dc3354732a54d6d1b44b181 Mon Sep 17 00:00:00 2001 From: Eli Fine Date: Mon, 5 Jan 2026 18:04:36 +0000 Subject: [PATCH 01/16] fix --- template/.coveragerc | 3 ++ .../kiota_nullable_fixer.py | 30 +++++++++++-- .../pyproject.toml.jinja | 2 +- .../src/boot.py | 2 +- .../src/code_lib/common/__init__.py | 1 + .../src/code_lib/common/device_commands.py | 45 ++++++++++--------- .../code_lib/common/firmware_instance_base.py | 31 ++++--------- .../src/code_lib/common/nvm.py | 34 +++++++------- .../src/code_lib/common/serial_write.py | 30 ++++++------- .../src/code_lib/common/simulation.py | 37 +++++++++++++++ 10 files changed, 136 insertions(+), 79 deletions(-) create mode 100644 template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/simulation.py diff --git a/template/.coveragerc b/template/.coveragerc index 5f9051a8f..46eaaea28 100644 --- a/template/.coveragerc +++ b/template/.coveragerc @@ -25,6 +25,9 @@ exclude_also = # Abstract methods inherently can't be hit @abstractmethod + # CircuitPython-specific code can't be tested in CPython + if sys.implementation.name == "circuitpython": + fail_under = 100 [html] directory = coverage-report-pytest diff --git a/template/{% if has_backend %}backend{% endif %}/kiota_nullable_fixer.py b/template/{% if has_backend %}backend{% endif %}/kiota_nullable_fixer.py index dc8f3dffd..35f64ad79 100644 --- a/template/{% if has_backend %}backend{% endif %}/kiota_nullable_fixer.py +++ b/template/{% if has_backend %}backend{% endif %}/kiota_nullable_fixer.py @@ -71,8 +71,20 @@ def get_anyof_simple_nullable_fields(schema: dict[str, Any]) -> dict[str, dict[s other_type = other_item.get("type") other_format = other_item.get("format") + # Handle arrays + if other_type == "array": + items = other_item.get("items", {}) + item_type = items.get("type") + if item_type == "string": + simple_nullable_fields[field_name] = "list[str]" + elif item_type == "integer": + simple_nullable_fields[field_name] = "list[int]" + elif item_type == "number": + simple_nullable_fields[field_name] = "list[float]" + elif item_type == "boolean": + simple_nullable_fields[field_name] = "list[bool]" # Handle string with date-time format - if other_type == "string" and other_format == "date-time": + elif other_type == "string" and other_format == "date-time": simple_nullable_fields[field_name] = "datetime" # Handle regular simple types elif other_type == "string": @@ -121,6 +133,7 @@ def fix_model_file(file_path: Path, model_name: str, fields: dict[str, str]) -> getter_method: str writer_method: str python_type: str + primitive_type: str | None = None if field_type == "str": getter_method = "get_str_value" @@ -143,6 +156,13 @@ def fix_model_file(file_path: Path, model_name: str, fields: dict[str, str]) -> writer_method = "write_datetime_value" python_type = "datetime.datetime" needs_datetime_import = True + elif field_type.startswith("list["): + # Extract the inner type (e.g., "list[int]" -> "int") + inner_type = field_type[5:-1] # Remove "list[" and "]" + getter_method = "get_collection_of_primitive_values" + writer_method = "write_collection_of_primitive_values" + python_type = field_type + primitive_type = inner_type else: continue @@ -159,8 +179,12 @@ def fix_model_file(file_path: Path, model_name: str, fields: dict[str, str]) -> # 3. Fix get_field_deserializers # Change: lambda n: setattr(self, "field", n.get_object_value(ComposedType)) # To: lambda n: setattr(self, "field", n.get_str_value()) or n.get_bool_value() etc. - deserializer_pattern = rf'("{re.escape(field)}":\s+lambda\s+n\s*:\s*setattr\(self,\s*[\'\"]{re.escape(field)}[\'\"]\s*,\s*)n\.get_object_value\({re.escape(composed_type_name)}\)\)' - content = re.sub(deserializer_pattern, rf"\1n.{getter_method}())", content) + deserializer_pattern = rf'("{re.escape(field)}":\s+lambda\s+n\s*:\s*setattr\(self,\s*[\'"]{re.escape(field)}[\'"]\s*,\s*)n\.get_object_value\({re.escape(composed_type_name)}\)\)' + if primitive_type: + # For collections, pass the type + content = re.sub(deserializer_pattern, rf"\1n.{getter_method}({primitive_type}))", content) + else: + content = re.sub(deserializer_pattern, rf"\1n.{getter_method}())", content) # 4. Fix serialize method # Change: writer.write_object_value("field", self.field) diff --git a/template/{% if has_backend %}backend{% endif %}/pyproject.toml.jinja b/template/{% if has_backend %}backend{% endif %}/pyproject.toml.jinja index 17f9511b2..4cf5458fc 100644 --- a/template/{% if has_backend %}backend{% endif %}/pyproject.toml.jinja +++ b/template/{% if has_backend %}backend{% endif %}/pyproject.toml.jinja @@ -45,7 +45,7 @@ dev = [ "pytest-asyncio{% endraw %}{{ pytest_asyncio_version }}{% raw %}",{% endraw %}{% if backend_makes_api_calls %}{% raw %} "pytest-recording{% endraw %}{{ pytest_recording_version }}{% raw %}", "vcrpy{% endraw %}{{ vcrpy_version }}{% raw %}",{% endraw %}{% endif %}{% raw %}{% endraw %}{% if deploy_as_executable %}{% raw %} - "pyinstaller>={% endraw %}{{ pyinstaller_version }}{% raw %}",{% endraw %}{% endif %}{% raw %}{% endraw %}{% if is_circuit_python_driver %}{% raw %} + "pyinstaller{% endraw %}{{ pyinstaller_version }}{% raw %}",{% endraw %}{% endif %}{% raw %}{% endraw %}{% if is_circuit_python_driver %}{% raw %} "pytest-reserial>={% endraw %}0.6.0{% raw %}", "circup>=2.3.0", "adafruit-circuitpython-busdevice{% endraw %}{{ adafruit_circuitpython_busdevice_version }}{% raw %}", diff --git a/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/boot.py b/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/boot.py index f85bc1511..8f8de2650 100644 --- a/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/boot.py +++ b/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/boot.py @@ -42,7 +42,7 @@ data=desired_boot_mode != BootMode.DEVELOPMENT, # TODO: consider whether to enable both data and console in dev mode ) -if desired_boot_mode == BootMode.NORMAL: +if desired_boot_mode == BootMode.NORMAL: # pyright: ignore[reportUnnecessaryComparison] # pyright doesn't seem to understand that what happens in the try/except block could change the variable value storage.disable_usb_drive() # pyright: ignore[reportUnknownMemberType] # the storage library is not well typed supervisor.set_usb_identification( # pyright: ignore[reportUnknownMemberType] # the supervisor library is not well typed diff --git a/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/__init__.py b/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/__init__.py index a03d529be..09cda0c71 100644 --- a/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/__init__.py +++ b/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/__init__.py @@ -16,4 +16,5 @@ from .parsing import matches_command from .parsing import write_response from .serial_write import debug_message +from .simulation import SimulatedPeripheral from .singletons import get_firmware_instance diff --git a/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/device_commands.py b/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/device_commands.py index 14b4b2bd8..cab2057d2 100644 --- a/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/device_commands.py +++ b/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/device_commands.py @@ -2,7 +2,29 @@ from .singletons import get_firmware_instance -if sys.implementation.name == "cpython": +if sys.implementation.name == "circuitpython": + import microcontroller + import supervisor # pyright: ignore[reportMissingImports] # this is a CircuitPython library + from microcontroller import ( + cpus, # pyright: ignore[reportUnknownVariableType,reportAttributeAccessIssue] # this is a CircuitPython library + ) + from supervisor import ( # pyright: ignore[reportMissingImports] # this is a CircuitPython library + runtime, # pyright: ignore[reportUnknownVariableType] # this is a CircuitPython library + ) + from supervisor import ( # pyright: ignore[reportMissingImports] # this is a CircuitPython library + status_bar, # pyright: ignore[reportUnknownVariableType] # this is a CircuitPython library + ) + + def _reset_real(_: str | None = None): + microcontroller.reset() # pyright: ignore[reportUnknownMemberType,reportAttributeAccessIssue] # the microcontroller library is not well typed + + def _reload_real(_: str | None = None): + supervisor.reload() # pyright: ignore[reportUnknownMemberType] # the supervisor library is not well typed + + reload = _reload_real + reset = _reset_real + +else: from types import SimpleNamespace cpus = {} @@ -23,24 +45,3 @@ def _reset_sim(instance_id: str | None = None): reload = _reload_sim reset = _reset_sim -else: - import microcontroller - import supervisor # pyright: ignore[reportMissingImports] # this is a CircuitPython library - from microcontroller import ( - cpus, # noqa: F401 # imported for use in firmware_instance_base.py # pyright: ignore[reportUnknownVariableType,reportAttributeAccessIssue] # this is a CircuitPython library - ) - from supervisor import ( # pyright: ignore[reportMissingImports] # this is a CircuitPython library - runtime, # noqa: F401 # imported for use in firmware_instance_base.py # pyright: ignore[reportUnknownVariableType] # this is a CircuitPython library - ) - from supervisor import ( # pyright: ignore[reportMissingImports] # this is a CircuitPython library - status_bar, # noqa: F401 # imported for use in firmware_instance_base.py # pyright: ignore[reportUnknownVariableType] # this is a CircuitPython library - ) - - def _reset_real(_: str | None = None): - microcontroller.reset() # pyright: ignore[reportUnknownMemberType,reportAttributeAccessIssue] # the microcontroller library is not well typed - - def _reload_real(_: str | None = None): - supervisor.reload() # pyright: ignore[reportUnknownMemberType] # the supervisor library is not well typed - - reload = _reload_real - reset = _reset_real diff --git a/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/firmware_instance_base.py b/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/firmware_instance_base.py index 10a5b69b5..41a3ca271 100644 --- a/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/firmware_instance_base.py +++ b/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/firmware_instance_base.py @@ -9,17 +9,11 @@ from .base import ErrorCodeBase from .base import ResponseError from .base import is_command_arg_truthy -from .device_commands import ( - cpus, # pyright: ignore[reportUnknownVariableType,reportAttributeAccessIssue] # this is circuit python -) +from .device_commands import cpus # pyright: ignore[reportUnknownVariableType] # this is circuit python from .device_commands import reload from .device_commands import reset -from .device_commands import ( - runtime, # pyright: ignore[reportUnknownVariableType,reportAttributeAccessIssue] # this is circuit python -) -from .device_commands import ( - status_bar, # pyright: ignore[reportUnknownVariableType,reportAttributeAccessIssue] # this is circuit python -) +from .device_commands import runtime +from .device_commands import status_bar from .nvm import read_nvm_data from .nvm import write_nvm_data from .parsing import create_error_response @@ -249,19 +243,12 @@ def create_response( # noqa: PLR0911,C901,PLR0915,PLR0912 # TODO: consider brea ) response_data["os_info"] = { "implementation_version": circuitpython_version, - "runtime_autoreload": runtime.autoreload, # pyright: ignore[reportUnknownMemberType] # circuit python - "run_reason": str( - runtime.run_reason # pyright: ignore[reportUnknownMemberType,reportUnknownArgumentType] # circuit python - ) - .split(".")[-1] - .rstrip(">"), - "safe_mode_reason": str( - runtime.safe_mode_reason # pyright: ignore[reportUnknownMemberType,reportUnknownArgumentType] # circuit python - ) - .split(".")[-1] - .rstrip(">"), - "status_bar_console": status_bar.console, # pyright: ignore[reportUnknownMemberType] # circuit python - "status_bar_display": status_bar.display, # pyright: ignore[reportUnknownMemberType] # circuit python + "implementation": repr(sys.implementation), + "runtime_autoreload": runtime.autoreload, + "run_reason": str(runtime.run_reason).split(".")[-1].rstrip(">"), + "safe_mode_reason": str(runtime.safe_mode_reason).split(".")[-1].rstrip(">"), + "status_bar_console": status_bar.console, + "status_bar_display": status_bar.display, } response_data["cpu"] = { # pyright: ignore[reportArgumentType] # not sure why pyright is upset str(i): { diff --git a/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/nvm.py b/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/nvm.py index 4305008d2..30bc1e038 100644 --- a/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/nvm.py +++ b/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/nvm.py @@ -28,21 +28,7 @@ def generate_uuid4() -> str: ) -if sys.implementation.name == "cpython": - - def _read_nvm_data_sim(): - raise RuntimeError( # noqa: TRY003 - "in simulation mode this should never have been reached" - ) - - def _write_nvm_data_sim(): - raise RuntimeError( # noqa: TRY003 - "in simulation mode this should never have been reached" - ) - - read_nvm_data = _read_nvm_data_sim - write_nvm_data = _write_nvm_data_sim -else: +if sys.implementation.name == "circuitpython": import microcontroller def _read_string_from_nvm(*, start: int, length: int) -> str: @@ -119,3 +105,21 @@ def _read_nvm_data_real() -> dict[str, str | int]: read_nvm_data = _read_nvm_data_real write_nvm_data = _write_nvm_data_real + + +else: + + def _read_nvm_data_sim(): + raise RuntimeError( # noqa: TRY003 + "in simulation mode this should never have been reached" + ) + + def _write_nvm_data_sim( + data: dict[str, str | int], # noqa: ARG001 # the signature needs to match the real function + ): + raise RuntimeError( # noqa: TRY003 + "in simulation mode this should never have been reached" + ) + + read_nvm_data = _read_nvm_data_sim + write_nvm_data = _write_nvm_data_sim diff --git a/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/serial_write.py b/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/serial_write.py index a19a26b66..c224f4283 100644 --- a/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/serial_write.py +++ b/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/serial_write.py @@ -3,21 +3,7 @@ from .singletons import debug_mode from .singletons import get_firmware_instance -if sys.implementation.name == "cpython": - import logging - import socket - - logger = logging.getLogger(__name__) - - def write_raw_string_to_serial(data: str, *, instance_id: str | None = None): - f = get_firmware_instance(instance_id) - if not isinstance(f.socket, socket.socket): - raise TypeError( # noqa: TRY003 # not worth custom exception - "Firmware instance does not have a valid socket to write to" - ) - f.socket.sendall(data.encode()) - -else: +if sys.implementation.name == "circuitpython": import usb_cdc # pyright: ignore[reportMissingImports] # this is a CircuitPython library serial = usb_cdc.data # pyright: ignore[reportUnknownVariableType,reportUnknownMemberType] # the usb_cdc library is not well typed @@ -31,6 +17,20 @@ def write_raw_string_to_serial( ): serial.write(data.encode()) # pyright: ignore[reportUnknownMemberType] +else: + import logging + import socket + + logger = logging.getLogger(__name__) + + def write_raw_string_to_serial(data: str, *, instance_id: str | None = None): + f = get_firmware_instance(instance_id) + if not isinstance(f.socket, socket.socket): + raise TypeError( # noqa: TRY003 # not worth custom exception + "Firmware instance does not have a valid socket to write to" + ) + f.socket.sendall(data.encode()) + def debug_message(message: str): if debug_mode(): diff --git a/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/simulation.py b/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/simulation.py new file mode 100644 index 000000000..59e0f7d1e --- /dev/null +++ b/template/{% if has_backend %}backend{% endif %}/src/backend_api/{% if is_circuit_python_driver %}firmware{% endif %}/src/code_lib/common/simulation.py @@ -0,0 +1,37 @@ +import sys + + +class SimulatedPeripheral: + # Sentinel value to indicate no side effect was specified + _NO_SIDE_EFFECT = object() + + def __init__( # pyright: ignore[reportMissingSuperCall] # we don't want to call the super because it will do circuit python things with the class this is mixed in with + self, *, method_side_effects: dict[str, list[object]] | None = None + ): + if method_side_effects is None: + method_side_effects = {} + self._method_side_effects = method_side_effects + self._init() + + def _init(self) -> None: + """Run additional initialization a subclass may require.""" + + def _handle_side_effects(self) -> object: + """Handle side effects for the calling method. + + Returns: + _NO_SIDE_EFFECT if no side effect is specified for this method, + otherwise returns (or raises) the side effect value (which could be None). + """ + method_name = sys._getframe( # noqa: SLF001 # this isn't ideal, but inspect module doesn't seem to be on circuit python, and not sure of another way to get the method name dynamically + 1 + ).f_code.co_name + + if method_name in self._method_side_effects: + side_effects = self._method_side_effects[method_name] + if side_effects: + result = side_effects.pop(0) + if isinstance(result, Exception): + raise result + return result + return self._NO_SIDE_EFFECT From f8365b2bf06226e0de9a762637187aef5461fea8 Mon Sep 17 00:00:00 2001 From: Eli Fine Date: Mon, 5 Jan 2026 18:18:30 +0000 Subject: [PATCH 02/16] more copier --- .copier-answers.yml | 2 +- .devcontainer/devcontainer.json | 16 +++---- .devcontainer/install-ci-tooling.py | 4 +- extensions/context.py | 31 ++++++------- pyproject.toml | 2 +- .../.devcontainer/devcontainer.json.jinja | 22 +++++----- uv.lock | 44 +++++++++---------- 7 files changed, 61 insertions(+), 60 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 9cbee03f5..12da45c7b 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier -_commit: v0.0.91 +_commit: v0.0.91-3-g6d1a1d3 _src_path: gh:LabAutomationAndScreening/copier-base-template.git description: A web app that is hosted within a local intranet. Nuxt frontend, python backend, docker-compose diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index ca3aad856..4f1085d1b 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -16,24 +16,24 @@ "extensions": [ // basic tooling // "eamodio.gitlens@15.5.1", - "coderabbit.coderabbit-vscode@0.16.1", + "coderabbit.coderabbit-vscode@0.16.4", "ms-vscode.live-server@0.5.2025051301", "MS-vsliveshare.vsliveshare@1.0.5905", "github.copilot@1.388.0", - "github.copilot-chat@0.34.2025112401", + "github.copilot-chat@0.36.2026010502", // Python - "ms-python.python@2025.17.2025100201", - "ms-python.vscode-pylance@2025.8.3", + "ms-python.python@2025.21.2026010501", + "ms-python.vscode-pylance@2025.10.100", "ms-vscode-remote.remote-containers@0.414.0", - "charliermarsh.ruff@2025.28.0", + "charliermarsh.ruff@2025.32.0", // Misc file formats - "bierner.markdown-mermaid@1.28.0", + "bierner.markdown-mermaid@1.29.0", "samuelcolvin.jinjahtml@0.20.0", "tamasfe.even-better-toml@0.19.2", "emilast.LogFileHighlighter@3.3.3", - "esbenp.prettier-vscode@11.0.0" + "esbenp.prettier-vscode@11.0.2" ], "settings": { "editor.accessibilitySupport": "off", // turn off sounds @@ -58,5 +58,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): 2f01e630 # spellchecker:disable-line + // Devcontainer context hash (do not manually edit this, it's managed by a pre-commit hook): a8a4e25e # spellchecker:disable-line } diff --git a/.devcontainer/install-ci-tooling.py b/.devcontainer/install-ci-tooling.py index c5af5b8c5..98a0eb5de 100644 --- a/.devcontainer/install-ci-tooling.py +++ b/.devcontainer/install-ci-tooling.py @@ -7,8 +7,8 @@ import tempfile from pathlib import Path -UV_VERSION = "0.9.18" -PNPM_VERSION = "10.25.0" +UV_VERSION = "0.9.21" +PNPM_VERSION = "10.27.0" COPIER_VERSION = "==9.11.0" COPIER_TEMPLATE_EXTENSIONS_VERSION = "==0.3.3" PRE_COMMIT_VERSION = "4.5.0" diff --git a/extensions/context.py b/extensions/context.py index 456a3b9c7..fe57776f0 100644 --- a/extensions/context.py +++ b/extensions/context.py @@ -10,46 +10,47 @@ class ContextUpdater(ContextHook): @override def hook(self, context: dict[Any, Any]) -> dict[Any, Any]: - context["uv_version"] = "0.9.18" - context["pnpm_version"] = "10.25.0" + context["uv_version"] = "0.9.21" + context["pnpm_version"] = "10.27.0" context["pre_commit_version"] = "4.5.0" context["pyright_version"] = ">=1.1.407" context["pytest_version"] = ">=9.0.2" context["pytest_randomly_version"] = ">=4.0.1" context["pytest_cov_version"] = ">=7.0.0" - context["ty_version"] = ">=0.0.2" + context["ty_version"] = ">=0.0.9" context["copier_version"] = "==9.11.0" context["copier_template_extensions_version"] = "==0.3.3" context["sphinx_version"] = "9.0.4" - context["pulumi_version"] = ">=3.212.0" - context["pulumi_aws_version"] = ">=7.14.0" - context["pulumi_aws_native_version"] = ">=1.40.0" + context["pulumi_version"] = ">=3.214.4" + context["pulumi_aws_version"] = ">=7.15.0" + context["pulumi_aws_native_version"] = ">=1.47.0" context["pulumi_command_version"] = ">=1.1.3" - context["pulumi_github_version"] = ">=6.9.1" + context["pulumi_github_version"] = ">=6.10.0" context["pulumi_okta_version"] = ">=6.2.0" context["boto3_version"] = ">=1.42.11" - context["ephemeral_pulumi_deploy_version"] = ">=0.0.5" + context["ephemeral_pulumi_deploy_version"] = ">=0.0.6" context["pydantic_version"] = ">=2.12.5" - context["pyinstaller_version"] = "6.17.0" + context["pyinstaller_version"] = ">=6.17.0" context["setuptools_version"] = "80.7.1" context["strawberry_graphql_version"] = ">=0.287.0" - context["fastapi_version"] = ">=0.124.2" + context["fastapi_version"] = ">=0.128.0" context["fastapi_offline_version"] = ">=1.7.4" - context["uvicorn_version"] = ">=0.38.0" - context["lab_auto_pulumi_version"] = ">=0.1.17" + context["uvicorn_version"] = ">=0.40.0" + context["lab_auto_pulumi_version"] = ">=0.1.18" context["ariadne_codegen_version"] = ">=0.17.0" context["pytest_mock_version"] = "3.15.1" context["uuid_utils_version"] = ">=0.12.0" context["syrupy_version"] = ">=5.0.0" context["structlog_version"] = ">=25.5.0" context["httpx_version"] = "0.28.1" - context["python_kiota_bundle_version"] = ">=1.9.7" - context["vcrpy_version"] = ">=8.1.0" + context["python_kiota_bundle_version"] = ">=1.9.8" + context["vcrpy_version"] = ">=8.1.1" context["pytest_recording_version"] = ">=0.13.4" context["pytest_asyncio_version"] = ">=1.3.0" + context["pytest_reserial_version"] = ">=0.6.0" context["node_version"] = "24.11.1" - context["nuxt_ui_version"] = "^4.2.1" + context["nuxt_ui_version"] = "^4.3.0" context["nuxt_version"] = "^4.2.2" context["nuxt_icon_version"] = "^2.1.0" context["typescript_version"] = "^5.9.3" diff --git a/pyproject.toml b/pyproject.toml index fcf016553..48e2c7976 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ dependencies = [ "pytest-cov>=7.0.0", "pytest-randomly>=4.0.1", "pyright[nodejs]>=1.1.407", - "ty>=0.0.2", + "ty>=0.0.9", "copier==9.11.0", "copier-template-extensions==0.3.3" ] diff --git a/template/.devcontainer/devcontainer.json.jinja b/template/.devcontainer/devcontainer.json.jinja index af0f2bdf1..7b98bc7e2 100644 --- a/template/.devcontainer/devcontainer.json.jinja +++ b/template/.devcontainer/devcontainer.json.jinja @@ -29,32 +29,32 @@ "-AmazonWebServices.aws-toolkit-vscode", // the AWS CLI feature installs this automatically, but it's causing problems in VS Code{% endraw %}{% endif %}{% raw %} // basic tooling // "eamodio.gitlens@15.5.1", - "coderabbit.coderabbit-vscode@0.16.1", + "coderabbit.coderabbit-vscode@0.16.4", "ms-vscode.live-server@0.5.2025051301", "MS-vsliveshare.vsliveshare@1.0.5905", "github.copilot@1.388.0", - "github.copilot-chat@0.34.2025112401",{% endraw %}{% if install_claude_cli %}{% raw %} - "anthropic.claude-code@2.0.27",{% endraw %}{% endif %}{% raw %} + "github.copilot-chat@0.36.2026010502",{% endraw %}{% if install_claude_cli %}{% raw %} + "anthropic.claude-code@2.0.75",{% endraw %}{% endif %}{% raw %} // Python - "ms-python.python@2025.17.2025100201", - "ms-python.vscode-pylance@2025.8.3", + "ms-python.python@2025.21.2026010501", + "ms-python.vscode-pylance@2025.10.100", "ms-vscode-remote.remote-containers@0.414.0", - "charliermarsh.ruff@2025.28.0", + "charliermarsh.ruff@2025.32.0", {% endraw %}{% if is_child_of_copier_base_template is not defined and template_uses_vuejs is defined and template_uses_vuejs is sameas(true) %}{% raw %} // VueJS - "vue.volar@3.0.6", - "vitest.explorer@1.16.1", + "vue.volar@3.2.1", + "vitest.explorer@1.16.0", {% endraw %}{% endif %}{% raw %}{% endraw %}{% if is_child_of_copier_base_template is not defined and template_uses_javascript is defined and template_uses_javascript is sameas(true) %}{% raw %} // All javascript - "dbaeumer.vscode-eslint@3.0.19", + "dbaeumer.vscode-eslint@3.0.21", {% endraw %}{% endif %}{% raw %} // Misc file formats - "bierner.markdown-mermaid@1.28.0", + "bierner.markdown-mermaid@1.29.0", "samuelcolvin.jinjahtml@0.20.0", "tamasfe.even-better-toml@0.19.2", "emilast.LogFileHighlighter@3.3.3", - "esbenp.prettier-vscode@11.0.0" + "esbenp.prettier-vscode@11.0.2" ], "settings": { "editor.accessibilitySupport": "off", // turn off sounds diff --git a/uv.lock b/uv.lock index 478654b86..227e69431 100644 --- a/uv.lock +++ b/uv.lock @@ -66,7 +66,7 @@ requires-dist = [ { name = "pytest", specifier = ">=9.0.2" }, { name = "pytest-cov", specifier = ">=7.0.0" }, { name = "pytest-randomly", specifier = ">=4.0.1" }, - { name = "ty", specifier = ">=0.0.2" }, + { name = "ty", specifier = ">=0.0.9" }, ] [[package]] @@ -498,27 +498,27 @@ wheels = [ [[package]] name = "ty" -version = "0.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/47/e5/15b6aceefcd64b53997fe2002b6fa055f0b1afd23ff6fc3f55f3da944530/ty-0.0.2.tar.gz", hash = "sha256:e02dc50b65dc58d6cb8e8b0d563833f81bf03ed8a7d0b15c6396d486489a7e1d", size = 4762024, upload-time = "2025-12-16T20:13:41.07Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/86/65d4826677d966cf226662767a4a597ebb4b02c432f413673c8d5d3d1ce8/ty-0.0.2-py3-none-linux_armv6l.whl", hash = "sha256:0954a0e0b6f7e06229dd1da3a9989ee9b881a26047139a88eb7c134c585ad22e", size = 9771409, upload-time = "2025-12-16T20:13:28.964Z" }, - { url = "https://files.pythonhosted.org/packages/d4/bc/6ab06b7c109cec608c24ea182cc8b4714e746a132f70149b759817092665/ty-0.0.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d6044b491d66933547033cecc87cb7eb599ba026a3ef347285add6b21107a648", size = 9580025, upload-time = "2025-12-16T20:13:34.507Z" }, - { url = "https://files.pythonhosted.org/packages/54/de/d826804e304b2430f17bb27ae15bcf02380e7f67f38b5033047e3d2523e6/ty-0.0.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fbca7f08e671a35229f6f400d73da92e2dc0a440fba53a74fe8233079a504358", size = 9098660, upload-time = "2025-12-16T20:13:01.278Z" }, - { url = "https://files.pythonhosted.org/packages/b7/8e/5cd87944ceee02bb0826f19ced54e30c6bb971e985a22768f6be6b1a042f/ty-0.0.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3abd61153dac0b93b284d305e6f96085013a25c3a7ab44e988d24f0a5fcce729", size = 9567693, upload-time = "2025-12-16T20:13:12.559Z" }, - { url = "https://files.pythonhosted.org/packages/c6/b1/062aab2c62c5ae01c05d27b97ba022d9ff66f14a3cb9030c5ad1dca797ec/ty-0.0.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:21a9f28caafb5742e7d594104e2fe2ebd64590da31aed4745ae8bc5be67a7b85", size = 9556471, upload-time = "2025-12-16T20:13:07.771Z" }, - { url = "https://files.pythonhosted.org/packages/0e/07/856f6647a9dd6e36560d182d35d3b5fb21eae98a8bfb516cd879d0e509f3/ty-0.0.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3ec63fd23ab48e0f838fb54a47ec362a972ee80979169a7edfa6f5c5034849d", size = 9971914, upload-time = "2025-12-16T20:13:18.852Z" }, - { url = "https://files.pythonhosted.org/packages/2e/82/c2e3957dbf33a23f793a9239cfd8bd04b6defd999bd0f6e74d6a5afb9f42/ty-0.0.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:e5e2e0293a259c9a53f668c9c13153cc2f1403cb0fe2b886ca054be4ac76517c", size = 10840905, upload-time = "2025-12-16T20:13:37.098Z" }, - { url = "https://files.pythonhosted.org/packages/3b/17/49bd74e3d577e6c88b8074581b7382f532a9d40552cc7c48ceaa83f1d950/ty-0.0.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2511ac02a83d0dc45d4570c7e21ec0c919be7a7263bad9914800d0cde47817", size = 10570251, upload-time = "2025-12-16T20:13:10.319Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9b/26741834069722033a1a0963fcbb63ea45925c6697357e64e361753c6166/ty-0.0.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c482bfbfb8ad18b2e62427d02a0c934ac510c414188a3cf00e16b8acc35482f0", size = 10369078, upload-time = "2025-12-16T20:13:20.851Z" }, - { url = "https://files.pythonhosted.org/packages/94/fc/1d34ec891900d9337169ff9f8252fcaa633ae5c4d36b67effd849ed4f9ac/ty-0.0.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb514711eed3f56d7a130d4885f4b5d8e490fdcd2adac098e5cf175573a0dda3", size = 10121064, upload-time = "2025-12-16T20:13:23.095Z" }, - { url = "https://files.pythonhosted.org/packages/e5/02/e640325956172355ef8deb9b08d991f229230bf9d07f1dbda8c6665a3a43/ty-0.0.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b2c37fa26c39e9fbed7c73645ba721968ab44f28b2bfe2f79a4e15965a1c426f", size = 9553817, upload-time = "2025-12-16T20:13:27.057Z" }, - { url = "https://files.pythonhosted.org/packages/35/13/c93d579ece84895da9b0aae5d34d84100bbff63ad9f60c906a533a087175/ty-0.0.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:13b264833ac5f3b214693fca38e380e78ee7327e09beaa5ff2e47d75fcab9692", size = 9577512, upload-time = "2025-12-16T20:13:16.956Z" }, - { url = "https://files.pythonhosted.org/packages/85/53/93ab1570adc799cd9120ea187d5b4c00d821e86eca069943b179fe0d3e83/ty-0.0.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:08658d6dbbf8bdef80c0a77eda56a22ab6737002ba129301b7bbd36bcb7acd75", size = 9692726, upload-time = "2025-12-16T20:13:31.169Z" }, - { url = "https://files.pythonhosted.org/packages/9a/07/5fff5335858a14196776207d231c32e23e48a5c912a7d52c80e7a3fa6f8f/ty-0.0.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4a21b5b012061cb13d47edfff6be70052694308dba633b4c819b70f840e6c158", size = 10213996, upload-time = "2025-12-16T20:13:14.606Z" }, - { url = "https://files.pythonhosted.org/packages/a0/d3/896b1439ab765c57a8d732f73c105ec41142c417a582600638385c2bee85/ty-0.0.2-py3-none-win32.whl", hash = "sha256:d773fdad5d2b30f26313204e6b191cdd2f41ab440a6c241fdb444f8c6593c288", size = 9204906, upload-time = "2025-12-16T20:13:25.099Z" }, - { url = "https://files.pythonhosted.org/packages/5d/0a/f30981e7d637f78e3d08e77d63b818752d23db1bc4b66f9e82e2cb3d34f8/ty-0.0.2-py3-none-win_amd64.whl", hash = "sha256:d1c9ac78a8aa60d0ce89acdccf56c3cc0fcb2de07f1ecf313754d83518e8e8c5", size = 10066640, upload-time = "2025-12-16T20:13:04.045Z" }, - { url = "https://files.pythonhosted.org/packages/5a/c4/97958503cf62bfb7908d2a77b03b91a20499a7ff405f5a098c4989589f34/ty-0.0.2-py3-none-win_arm64.whl", hash = "sha256:fbdef644ade0cd4420c4ec14b604b7894cefe77bfd8659686ac2f6aba9d1a306", size = 9572022, upload-time = "2025-12-16T20:13:39.189Z" }, +version = "0.0.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/7b/4f677c622d58563c593c32081f8a8572afd90e43dc15b0dedd27b4305038/ty-0.0.9.tar.gz", hash = "sha256:83f980c46df17586953ab3060542915827b43c4748a59eea04190c59162957fe", size = 4858642, upload-time = "2026-01-05T12:24:56.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/3f/c1ee119738b401a8081ff84341781122296b66982e5982e6f162d946a1ff/ty-0.0.9-py3-none-linux_armv6l.whl", hash = "sha256:dd270d4dd6ebeb0abb37aee96cbf9618610723677f500fec1ba58f35bfa8337d", size = 9763596, upload-time = "2026-01-05T12:24:37.43Z" }, + { url = "https://files.pythonhosted.org/packages/63/41/6b0669ef4cd806d4bd5c30263e6b732a362278abac1bc3a363a316cde896/ty-0.0.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:debfb2ba418b00e86ffd5403cb666b3f04e16853f070439517dd1eaaeeff9255", size = 9591514, upload-time = "2026-01-05T12:24:26.891Z" }, + { url = "https://files.pythonhosted.org/packages/02/a1/874aa756aee5118e690340a771fb9ded0d0c2168c0b7cc7d9561c2a750b0/ty-0.0.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:107c76ebb05a13cdb669172956421f7ffd289ad98f36d42a44a465588d434d58", size = 9097773, upload-time = "2026-01-05T12:24:14.442Z" }, + { url = "https://files.pythonhosted.org/packages/32/62/cb9a460cf03baab77b3361d13106b93b40c98e274d07c55f333ce3c716f6/ty-0.0.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6868ca5c87ca0caa1b3cb84603c767356242b0659b88307eda69b2fb0bfa416b", size = 9581824, upload-time = "2026-01-05T12:24:35.074Z" }, + { url = "https://files.pythonhosted.org/packages/5a/97/633ecb348c75c954f09f8913669de8c440b13b43ea7d214503f3f1c4bb60/ty-0.0.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d14a4aa0eb5c1d3591c2adbdda4e44429a6bb5d2e298a704398bb2a7ccdafdfe", size = 9591050, upload-time = "2026-01-05T12:24:08.804Z" }, + { url = "https://files.pythonhosted.org/packages/6f/e6/4b0c6a7a8a234e2113f88c80cc7aaa9af5868de7a693859f3c49da981934/ty-0.0.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01bd4466504cefa36b465c6608e9af4504415fa67f6affc01c7d6ce36663c7f4", size = 10018262, upload-time = "2026-01-05T12:24:53.791Z" }, + { url = "https://files.pythonhosted.org/packages/cb/97/076d72a028f6b31e0b87287aa27c5b71a2f9927ee525260ea9f2f56828b8/ty-0.0.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:76c8253d1b30bc2c3eaa1b1411a1c34423decde0f4de0277aa6a5ceacfea93d9", size = 10911642, upload-time = "2026-01-05T12:24:48.264Z" }, + { url = "https://files.pythonhosted.org/packages/3f/5a/705d6a5ed07ea36b1f23592c3f0dbc8fc7649267bfbb3bf06464cdc9a98a/ty-0.0.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8992fa4a9c6a5434eae4159fdd4842ec8726259bfd860e143ab95d078de6f8e3", size = 10632468, upload-time = "2026-01-05T12:24:24.118Z" }, + { url = "https://files.pythonhosted.org/packages/44/78/4339a254537488d62bf392a936b3ec047702c0cc33d6ce3a5d613f275cd0/ty-0.0.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c79d503d151acb4a145a3d98702d07cb641c47292f63e5ffa0151e4020a5d33", size = 10273422, upload-time = "2026-01-05T12:24:45.8Z" }, + { url = "https://files.pythonhosted.org/packages/90/40/e7f386e87c9abd3670dcee8311674d7e551baa23b2e4754e2405976e6c92/ty-0.0.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7a7ebf89ed276b564baa1f0dd9cd708e7b5aa89f19ce1b2f7d7132075abf93e", size = 10120289, upload-time = "2026-01-05T12:24:17.424Z" }, + { url = "https://files.pythonhosted.org/packages/f7/46/1027442596e725c50d0d1ab5179e9fa78a398ab412994b3006d0ee0899c7/ty-0.0.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ae3866e50109d2400a886bb11d9ef607f23afc020b226af773615cf82ae61141", size = 9566657, upload-time = "2026-01-05T12:24:51.048Z" }, + { url = "https://files.pythonhosted.org/packages/56/be/df921cf1967226aa01690152002b370a7135c6cced81e86c12b86552cdc4/ty-0.0.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:185244a5eacfcd8f5e2d85b95e4276316772f1e586520a6cb24aa072ec1bac26", size = 9610334, upload-time = "2026-01-05T12:24:20.334Z" }, + { url = "https://files.pythonhosted.org/packages/ac/e8/f085268860232cc92ebe95415e5c8640f7f1797ac3a49ddd137c6222924d/ty-0.0.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f834ff27d940edb24b2e86bbb3fb45ab9e07cf59ca8c5ac615095b2542786408", size = 9726701, upload-time = "2026-01-05T12:24:29.785Z" }, + { url = "https://files.pythonhosted.org/packages/42/b4/9394210c66041cd221442e38f68a596945103d9446ece505889ffa9b3da9/ty-0.0.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:773f4b3ba046de952d7c1ad3a2c09b24f3ed4bc8342ae3cbff62ebc14aa6d48c", size = 10227082, upload-time = "2026-01-05T12:24:40.132Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9f/75951eb573b473d35dd9570546fc1319f7ca2d5b5c50a5825ba6ea6cb33a/ty-0.0.9-py3-none-win32.whl", hash = "sha256:1f20f67e373038ff20f36d5449e787c0430a072b92d5933c5b6e6fc79d3de4c8", size = 9176458, upload-time = "2026-01-05T12:24:32.559Z" }, + { url = "https://files.pythonhosted.org/packages/9b/80/b1cdf71ac874e72678161e25e2326a7d30bc3489cd3699561355a168e54f/ty-0.0.9-py3-none-win_amd64.whl", hash = "sha256:2c415f3bbb730f8de2e6e0b3c42eb3a91f1b5fbbcaaead2e113056c3b361c53c", size = 10040479, upload-time = "2026-01-05T12:24:42.697Z" }, + { url = "https://files.pythonhosted.org/packages/b5/8f/abc75c4bb774b12698629f02d0d12501b0a7dff9c31dc3bd6b6c6467e90a/ty-0.0.9-py3-none-win_arm64.whl", hash = "sha256:48e339d794542afeed710ea4f846ead865cc38cecc335a9c781804d02eaa2722", size = 9543127, upload-time = "2026-01-05T12:24:11.731Z" }, ] [[package]] From efddaa936661d60aa10c0d185dd6dbc3d5680ded Mon Sep 17 00:00:00 2001 From: Eli Fine Date: Mon, 5 Jan 2026 18:25:45 +0000 Subject: [PATCH 03/16] project --- .../{% if has_backend %}backend{% endif %}/pyproject.toml.jinja | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/{% if has_backend %}backend{% endif %}/pyproject.toml.jinja b/template/{% if has_backend %}backend{% endif %}/pyproject.toml.jinja index 4cf5458fc..c3c4e7aa2 100644 --- a/template/{% if has_backend %}backend{% endif %}/pyproject.toml.jinja +++ b/template/{% if has_backend %}backend{% endif %}/pyproject.toml.jinja @@ -46,7 +46,7 @@ dev = [ "pytest-recording{% endraw %}{{ pytest_recording_version }}{% raw %}", "vcrpy{% endraw %}{{ vcrpy_version }}{% raw %}",{% endraw %}{% endif %}{% raw %}{% endraw %}{% if deploy_as_executable %}{% raw %} "pyinstaller{% endraw %}{{ pyinstaller_version }}{% raw %}",{% endraw %}{% endif %}{% raw %}{% endraw %}{% if is_circuit_python_driver %}{% raw %} - "pytest-reserial>={% endraw %}0.6.0{% raw %}", + "pytest-reserial{% endraw %}{{ pytest_reserial_version }}{% raw %}", "circup>=2.3.0", "adafruit-circuitpython-busdevice{% endraw %}{{ adafruit_circuitpython_busdevice_version }}{% raw %}", "adafruit-circuitpython-register{% endraw %}{{ adafruit_circuitpython_register_version }}{% raw %}",{% endraw %}{% endif %}{% raw %} From 182dc5e00be783acaa47514074e6e45bd040a09c Mon Sep 17 00:00:00 2001 From: Eli Fine Date: Mon, 5 Jan 2026 18:30:35 +0000 Subject: [PATCH 04/16] more copier --- .coderabbit.yaml | 4 ++++ .copier-answers.yml | 2 +- template/.coderabbit.yaml | 8 ++++++-- .../pyproject.toml.jinja | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.coderabbit.yaml b/.coderabbit.yaml index 213afdd5e..9904260d7 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -1,9 +1,12 @@ # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json +early_access: true reviews: profile: assertive path_instructions: - path: "**/vendor_files/**" instructions: "These files came from a vendor and we're not allowed to change them. Refer to it if you need to understand how the main code interacts with it, but do not make comments about it." + - path: "**/*.py" + instructions: "Do not express concerns about assert statements being removed by using the -O python flag; we never use that flag. Do not express concerns about ruff rules; a pre-commit hook already runs a ruff check. Do not warn about unnecessary super().init() calls; pyright prefers those to be present." tools: eslint: # when the code contains typescript, eslint will be run by pre-commit, and coderabbit often generates false positives enabled: false @@ -14,6 +17,7 @@ reviews: flake8: # we use ruff instead (when we use Python) enabled: false poem: false + in_progress_fortune: false # the commit status is driven by our repository config and required checks, we don't want CodeRabbit messing with it commit_status: false auto_review: diff --git a/.copier-answers.yml b/.copier-answers.yml index 12da45c7b..afb5adadc 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier -_commit: v0.0.91-3-g6d1a1d3 +_commit: v0.0.91-7-g101655e _src_path: gh:LabAutomationAndScreening/copier-base-template.git description: A web app that is hosted within a local intranet. Nuxt frontend, python backend, docker-compose diff --git a/template/.coderabbit.yaml b/template/.coderabbit.yaml index 6142f259e..bba651d5b 100644 --- a/template/.coderabbit.yaml +++ b/template/.coderabbit.yaml @@ -1,15 +1,18 @@ # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json +early_access: true reviews: profile: assertive path_instructions: - - path: "**/vendor_files/**" - instructions: "These files came from a vendor and we're not allowed to change them. Refer to it if you need to understand how the main code interacts with it, but do not make comments about it." - path: "**/generated/open-api/**" instructions: "This is generated client code for the API. Refer to it if you need to understand how the main code interacts with it, but do not make comments about it." - path: "**/generated/open_api/**" instructions: "This is generated client code for the API. Refer to it if you need to understand how the main code interacts with it, but do not make comments about it." - path: "**/generated/graphql.ts" instructions: "This is generated client code for the API. Refer to it if you need to understand how the main code interacts with it, but do not make comments about it." + - path: "**/vendor_files/**" + instructions: "These files came from a vendor and we're not allowed to change them. Refer to it if you need to understand how the main code interacts with it, but do not make comments about it." + - path: "**/*.py" + instructions: "Do not express concerns about assert statements being removed by using the -O python flag; we never use that flag. Do not express concerns about ruff rules; a pre-commit hook already runs a ruff check. Do not warn about unnecessary super().init() calls; pyright prefers those to be present." tools: eslint: # when the code contains typescript, eslint will be run by pre-commit, and coderabbit often generates false positives enabled: false @@ -20,6 +23,7 @@ reviews: flake8: # we use ruff instead (when we use Python) enabled: false poem: false + in_progress_fortune: false # the commit status is driven by our repository config and required checks, we don't want CodeRabbit messing with it commit_status: false auto_review: diff --git a/template/{% if has_backend %}backend{% endif %}/pyproject.toml.jinja b/template/{% if has_backend %}backend{% endif %}/pyproject.toml.jinja index c3c4e7aa2..d644ac13c 100644 --- a/template/{% if has_backend %}backend{% endif %}/pyproject.toml.jinja +++ b/template/{% if has_backend %}backend{% endif %}/pyproject.toml.jinja @@ -41,7 +41,7 @@ dev = [ "pytest{% endraw %}{{ pytest_version }}{% raw %}", "pytest-cov{% endraw %}{{ pytest_cov_version }}{% raw %}", "pytest-randomly{% endraw %}{{ pytest_randomly_version }}{% raw %}", - "pytest-mock>={% endraw %}{{ pytest_mock_version }}{% raw %}", + "pytest-mock{% endraw %}{{ pytest_mock_version }}{% raw %}", "pytest-asyncio{% endraw %}{{ pytest_asyncio_version }}{% raw %}",{% endraw %}{% if backend_makes_api_calls %}{% raw %} "pytest-recording{% endraw %}{{ pytest_recording_version }}{% raw %}", "vcrpy{% endraw %}{{ vcrpy_version }}{% raw %}",{% endraw %}{% endif %}{% raw %}{% endraw %}{% if deploy_as_executable %}{% raw %} From d0cb5eed78a74485dec2ee7f6a30c1d5e73248ff Mon Sep 17 00:00:00 2001 From: Eli Fine Date: Mon, 5 Jan 2026 18:32:48 +0000 Subject: [PATCH 05/16] logging --- .../src/backend_api/logger_config.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/template/{% if has_backend %}backend{% endif %}/src/backend_api/logger_config.py b/template/{% if has_backend %}backend{% endif %}/src/backend_api/logger_config.py index 749faa392..10c9b9b44 100644 --- a/template/{% if has_backend %}backend{% endif %}/src/backend_api/logger_config.py +++ b/template/{% if has_backend %}backend{% endif %}/src/backend_api/logger_config.py @@ -79,7 +79,12 @@ def configure_logging( json_processors = [ *shared_processors, - structlog.processors.ExceptionRenderer(structlog.tracebacks.ExceptionDictTransformer()), + structlog.processors.ExceptionRenderer( + structlog.tracebacks.ExceptionDictTransformer( + locals_max_length=50, # increase from default 10 + locals_max_string=500, # Increase from default 80 + ) + ), structlog.processors.EventRenamer(to="message"), structlog.stdlib.ProcessorFormatter.remove_processors_meta, structlog.processors.JSONRenderer(), From e5cd28ef997539581db1de835949716c926c4f42 Mon Sep 17 00:00:00 2001 From: Eli Fine Date: Mon, 5 Jan 2026 18:54:06 +0000 Subject: [PATCH 06/16] bump --- .copier-answers.yml | 2 +- .github/workflows/ci.yaml | 2 +- extensions/context.py | 19 +++++++++---------- template/frontend/package.json.jinja | 4 ++-- tests/copier_data/data1.yaml | 2 +- tests/copier_data/data2.yaml | 2 +- 6 files changed, 15 insertions(+), 16 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index afb5adadc..8a737dd21 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier -_commit: v0.0.91-7-g101655e +_commit: v0.0.91-9-gc2c85f8 _src_path: gh:LabAutomationAndScreening/copier-base-template.git description: A web app that is hosted within a local intranet. Nuxt frontend, python backend, docker-compose diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index cebf68f6b..b72aa6955 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -69,7 +69,7 @@ jobs: uses: ./.github/actions/install_deps with: python-version: ${{ matrix.python-version }} - node-version: 24.11.1 + node-version: 24.10.4 install-deps: false - name: Instantiate copier template diff --git a/extensions/context.py b/extensions/context.py index fe57776f0..af014ef3f 100644 --- a/extensions/context.py +++ b/extensions/context.py @@ -38,7 +38,7 @@ def hook(self, context: dict[Any, Any]) -> dict[Any, Any]: context["uvicorn_version"] = ">=0.40.0" context["lab_auto_pulumi_version"] = ">=0.1.18" context["ariadne_codegen_version"] = ">=0.17.0" - context["pytest_mock_version"] = "3.15.1" + context["pytest_mock_version"] = ">=3.15.1" context["uuid_utils_version"] = ">=0.12.0" context["syrupy_version"] = ">=5.0.0" context["structlog_version"] = ">=25.5.0" @@ -49,24 +49,23 @@ def hook(self, context: dict[Any, Any]) -> dict[Any, Any]: context["pytest_asyncio_version"] = ">=1.3.0" context["pytest_reserial_version"] = ">=0.6.0" - context["node_version"] = "24.11.1" + context["node_version"] = "24.10.4" context["nuxt_ui_version"] = "^4.3.0" context["nuxt_version"] = "^4.2.2" - context["nuxt_icon_version"] = "^2.1.0" + context["nuxt_icon_version"] = "^2.1.1" context["typescript_version"] = "^5.9.3" context["playwright_version"] = "^1.57.0" - context["vue_version"] = "^3.5.25" - context["vue_tsc_version"] = "^3.1.2" + context["vue_version"] = "^3.5.26" + context["vue_tsc_version"] = "^3.2.1" context["vue_devtools_api_version"] = "^8.0.0" - context["vue_router_version"] = "^4.6.0" + context["vue_router_version"] = "^4.6.4" context["dotenv_cli_version"] = "^11.0.0" - context["faker_version"] = "^10.1.0" + context["faker_version"] = "^10.2.0" context["vitest_version"] = "^3.2.4" context["eslint_version"] = "~9.38.0" - context["nuxt_eslint_version"] = "^1.10.0" - context["zod_version"] = "^4.1.12" + context["nuxt_eslint_version"] = "^1.12.1" + context["zod_version"] = "^4.3.5" context["zod_from_json_schema_version"] = "^0.5.1" - context["types_node_version"] = "^25.0.0" 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" diff --git a/template/frontend/package.json.jinja b/template/frontend/package.json.jinja index 8a71e27d1..0726eca9a 100644 --- a/template/frontend/package.json.jinja +++ b/template/frontend/package.json.jinja @@ -38,7 +38,7 @@ "@faker-js/faker": "{% endraw %}{{ faker_version }}{% raw %}",{% endraw %}{% if frontend_uses_graphql %}{% raw %} "@graphql-codegen/cli": "{% endraw %}{{ graphql_codegen_cli_version }}{% raw %}", "@graphql-codegen/typescript": "{% endraw %}{{ graphql_codegen_typescript_version }}{% raw %}", - "@graphql-codegen/typescript-operations": "{% endraw %}{{ graphql_codegen_typescript_operations_version }}{% raw %}", + "@graphql-codegen/typescript-operations": "{% endraw %}{{ graphql_codegen_typescript_version }}{% raw %}", "@graphql-codegen/typescript-vue-apollo": "^4.1.2", "@graphql-tools/mock": "^9.0.22", "@graphql-tools/schema": "^10.0.23",{% endraw %}{% endif %}{% raw %} @@ -48,7 +48,7 @@ "@nuxtjs/apollo": "{% endraw %}{{ nuxt_apollo_version }}{% raw %}",{% endraw %}{% endif %}{% raw %} "@nuxtjs/eslint-config-typescript": "^12.1.0", "@playwright/test": "{% endraw %}{{ playwright_version }}{% raw %}", - "@types/node": "{% endraw %}{{ types_node_version }}{% raw %}", + "@types/node": "{% endraw %}{{ node_version }}{% raw %}", "@vitest/coverage-istanbul": "{% endraw %}{{ vitest_version }}{% raw %}",{% endraw %}{% if frontend_uses_graphql %}{% raw %} "@vue/apollo-composable": "^4.2.2",{% endraw %}{% endif %}{% raw %} "@vue/devtools-api": "{% endraw %}{{ vue_devtools_api_version }}{% raw %}", diff --git a/tests/copier_data/data1.yaml b/tests/copier_data/data1.yaml index f247e578f..e3f175f3f 100644 --- a/tests/copier_data/data1.yaml +++ b/tests/copier_data/data1.yaml @@ -10,7 +10,7 @@ install_aws_ssm_port_forwarding_plugin: true configure_vcrpy: true configure_python_asyncio: true -node_version: 22.13.0 +node_version: 24.10.4 python_package_registry: PyPI aws_identity_center_id: d-9145c20053 diff --git a/tests/copier_data/data2.yaml b/tests/copier_data/data2.yaml index 37abdc853..49b088c5a 100644 --- a/tests/copier_data/data2.yaml +++ b/tests/copier_data/data2.yaml @@ -10,7 +10,7 @@ install_aws_ssm_port_forwarding_plugin: false configure_vcrpy: false configure_python_asyncio: false -node_version: 22.14.0 +node_version: 24.10.4 python_package_registry: AWS CodeArtifact aws_central_infrastructure_account_id: 012321432543 From 787bdf3a422da0ba231bc2bcbae63f06e3cabd2e Mon Sep 17 00:00:00 2001 From: Eli Fine Date: Mon, 5 Jan 2026 19:02:49 +0000 Subject: [PATCH 07/16] Mroe copier --- .copier-answers.yml | 2 +- extensions/context.py | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 8a737dd21..78d1504e4 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier -_commit: v0.0.91-9-gc2c85f8 +_commit: v0.0.91-11-g2b9d2f9 _src_path: gh:LabAutomationAndScreening/copier-base-template.git description: A web app that is hosted within a local intranet. Nuxt frontend, python backend, docker-compose diff --git a/extensions/context.py b/extensions/context.py index af014ef3f..acf144cda 100644 --- a/extensions/context.py +++ b/extensions/context.py @@ -67,9 +67,8 @@ def hook(self, context: dict[Any, Any]) -> dict[Any, Any]: context["zod_version"] = "^4.3.5" context["zod_from_json_schema_version"] = "^0.5.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" - context["graphql_codegen_typescript_operations_version"] = "^5.0.0" + context["graphql_codegen_cli_version"] = "^6.1.0" + context["graphql_codegen_typescript_version"] = "^5.0.7" context["graphql_tools_mock_version"] = "^9.1.0" context["tailwindcss_version"] = "^4.1.11" context["iconify_vue_version"] = "^5.0.0" @@ -79,7 +78,7 @@ def hook(self, context: dict[Any, Any]) -> dict[Any, Any]: context["vue_test_utils_version"] = "^2.4.6" context["nuxt_test_utils_version"] = "3.19.1" context["vue_eslint_parser_version"] = "^10.1.3" - context["happy_dom_version"] = "^20.0.2" + context["happy_dom_version"] = "^20.0.11" context["node_kiota_bundle_version"] = "1.0.0-preview.99" context["gha_checkout"] = "v6.0.1" From 4fbd707290b087657eb1e3d2237300f1e2356761 Mon Sep 17 00:00:00 2001 From: Eli Fine Date: Mon, 5 Jan 2026 19:09:44 +0000 Subject: [PATCH 08/16] mor copier --- .copier-answers.yml | 2 +- copier.yml | 2 +- extensions/context.py | 2 +- template/.devcontainer/devcontainer.json.jinja | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 78d1504e4..8b9bb38e1 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier -_commit: v0.0.91-11-g2b9d2f9 +_commit: v0.0.91-15-g0cfb585 _src_path: gh:LabAutomationAndScreening/copier-base-template.git description: A web app that is hosted within a local intranet. Nuxt frontend, python backend, docker-compose diff --git a/copier.yml b/copier.yml index 2928a0384..5662bc463 100644 --- a/copier.yml +++ b/copier.yml @@ -35,7 +35,7 @@ use_windows_in_ci: node_version: type: str help: What version of NodeJS is used for development? - default: "{{ node_version }}" + default: "{{ default_node_version }}" install_aws_ssm_port_forwarding_plugin: diff --git a/extensions/context.py b/extensions/context.py index acf144cda..fb2d6c17c 100644 --- a/extensions/context.py +++ b/extensions/context.py @@ -49,7 +49,7 @@ def hook(self, context: dict[Any, Any]) -> dict[Any, Any]: context["pytest_asyncio_version"] = ">=1.3.0" context["pytest_reserial_version"] = ">=0.6.0" - context["node_version"] = "24.10.4" + context["default_node_version"] = "24.10.4" context["nuxt_ui_version"] = "^4.3.0" context["nuxt_version"] = "^4.2.2" context["nuxt_icon_version"] = "^2.1.1" diff --git a/template/.devcontainer/devcontainer.json.jinja b/template/.devcontainer/devcontainer.json.jinja index 7b98bc7e2..00518535e 100644 --- a/template/.devcontainer/devcontainer.json.jinja +++ b/template/.devcontainer/devcontainer.json.jinja @@ -17,7 +17,7 @@ }{% endraw %}{% if is_child_of_copier_base_template is not defined and template_uses_javascript is defined and template_uses_javascript is sameas(true) %}{% raw %}, "ghcr.io/devcontainers/features/node:1.6.3": { // https://github.com/devcontainers/features/tree/main/src/node - "version": "{% endraw %}{{ node_version }}{% raw %}", + "version": "{% endraw %}{% if is_child_of_copier_base_template is not defined %}{{ node_version }}{% else %}{{ default_node_version }}{% endif %}{% raw %}", "pnpmVersion": "{% endraw %}{{ pnpm_version }}{% raw %}" }{% endraw %}{% endif %}{% raw %}{% endraw %}{% if install_claude_cli %}{% raw %}, "ghcr.io/anthropics/devcontainer-features/claude-code:1.0.5": {}{% endraw %}{% endif %}{% raw %} From d7a1924af9bd76836a02b51c4e4f49b3c89c7991 Mon Sep 17 00:00:00 2001 From: Eli Fine Date: Mon, 5 Jan 2026 19:17:44 +0000 Subject: [PATCH 09/16] more node --- .copier-answers.yml | 2 +- .github/workflows/ci.yaml | 2 +- extensions/context.py | 2 +- template/frontend/package.json.jinja | 2 +- tests/copier_data/data1.yaml | 2 +- tests/copier_data/data2.yaml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 8b9bb38e1..0d31681ca 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier -_commit: v0.0.91-15-g0cfb585 +_commit: v0.0.91-16-ge7ff882 _src_path: gh:LabAutomationAndScreening/copier-base-template.git description: A web app that is hosted within a local intranet. Nuxt frontend, python backend, docker-compose diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b72aa6955..cebf68f6b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -69,7 +69,7 @@ jobs: uses: ./.github/actions/install_deps with: python-version: ${{ matrix.python-version }} - node-version: 24.10.4 + node-version: 24.11.1 install-deps: false - name: Instantiate copier template diff --git a/extensions/context.py b/extensions/context.py index fb2d6c17c..73b9b9e63 100644 --- a/extensions/context.py +++ b/extensions/context.py @@ -49,7 +49,7 @@ def hook(self, context: dict[Any, Any]) -> dict[Any, Any]: context["pytest_asyncio_version"] = ">=1.3.0" context["pytest_reserial_version"] = ">=0.6.0" - context["default_node_version"] = "24.10.4" + context["default_node_version"] = "24.11.1" context["nuxt_ui_version"] = "^4.3.0" context["nuxt_version"] = "^4.2.2" context["nuxt_icon_version"] = "^2.1.1" diff --git a/template/frontend/package.json.jinja b/template/frontend/package.json.jinja index 0726eca9a..7d6a726ea 100644 --- a/template/frontend/package.json.jinja +++ b/template/frontend/package.json.jinja @@ -48,7 +48,7 @@ "@nuxtjs/apollo": "{% endraw %}{{ nuxt_apollo_version }}{% raw %}",{% endraw %}{% endif %}{% raw %} "@nuxtjs/eslint-config-typescript": "^12.1.0", "@playwright/test": "{% endraw %}{{ playwright_version }}{% raw %}", - "@types/node": "{% endraw %}{{ node_version }}{% raw %}", + "@types/node": "^{% endraw %}{{ node_version.split('.')[0] }}{% raw %}", "@vitest/coverage-istanbul": "{% endraw %}{{ vitest_version }}{% raw %}",{% endraw %}{% if frontend_uses_graphql %}{% raw %} "@vue/apollo-composable": "^4.2.2",{% endraw %}{% endif %}{% raw %} "@vue/devtools-api": "{% endraw %}{{ vue_devtools_api_version }}{% raw %}", diff --git a/tests/copier_data/data1.yaml b/tests/copier_data/data1.yaml index e3f175f3f..c910370cd 100644 --- a/tests/copier_data/data1.yaml +++ b/tests/copier_data/data1.yaml @@ -10,7 +10,7 @@ install_aws_ssm_port_forwarding_plugin: true configure_vcrpy: true configure_python_asyncio: true -node_version: 24.10.4 +node_version: 24.11.1 python_package_registry: PyPI aws_identity_center_id: d-9145c20053 diff --git a/tests/copier_data/data2.yaml b/tests/copier_data/data2.yaml index 49b088c5a..82f5509c8 100644 --- a/tests/copier_data/data2.yaml +++ b/tests/copier_data/data2.yaml @@ -10,7 +10,7 @@ install_aws_ssm_port_forwarding_plugin: false configure_vcrpy: false configure_python_asyncio: false -node_version: 24.10.4 +node_version: 24.11.1 python_package_registry: AWS CodeArtifact aws_central_infrastructure_account_id: 012321432543 From 3dcd6fc9c099c89d81f384e90c0eb913cebe0ca6 Mon Sep 17 00:00:00 2001 From: Eli Fine Date: Mon, 5 Jan 2026 19:36:03 +0000 Subject: [PATCH 10/16] dep --- template/.github/dependabot.yml.jinja | 3 +++ 1 file changed, 3 insertions(+) diff --git a/template/.github/dependabot.yml.jinja b/template/.github/dependabot.yml.jinja index 2d692afe5..6051d527c 100644 --- a/template/.github/dependabot.yml.jinja +++ b/template/.github/dependabot.yml.jinja @@ -41,6 +41,9 @@ updates:{% endraw %}{% if has_backend %}{% raw %} - dependency-name: "*" update-types: - "version-update:semver-patch" # we don't want to be bothered with patch updates for anything except security updates + - dependency-name: "@types/node" + update-types: + - "version-update:semver-major" # @types/node major should be pinned to the node engine itself groups: prod-dependencies: dependency-type: "production" From 0287f3b5a670b57c733eb9b63c96b9e45b757080 Mon Sep 17 00:00:00 2001 From: Eli Fine Date: Mon, 5 Jan 2026 19:41:25 +0000 Subject: [PATCH 11/16] cophooks --- .copier-answers.yml | 2 +- .devcontainer/devcontainer.json | 2 +- .pre-commit-config.yaml | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 0d31681ca..22c2e5540 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier -_commit: v0.0.91-16-ge7ff882 +_commit: v0.0.91-17-g90f4ab9 _src_path: gh:LabAutomationAndScreening/copier-base-template.git description: A web app that is hosted within a local intranet. Nuxt frontend, python backend, docker-compose diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 4f1085d1b..324739466 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -58,5 +58,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): a8a4e25e # spellchecker:disable-line + // Devcontainer context hash (do not manually edit this, it's managed by a pre-commit hook): 1798e6dc # spellchecker:disable-line } diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index eebff267d..4d61b18ef 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -42,7 +42,7 @@ repos: # Reformatting (should generally come before any file format or other checks, because reformatting can change things) - repo: https://github.com/crate-ci/typos - rev: 802d5794ff9cf7b15610c47eca99cd1ab757d8d4 # frozen: v1 + rev: b31d3aa6e8e43e6a9cf7a1d137baf189dec0922b # frozen: v1 hooks: - id: typos exclude: | @@ -195,12 +195,12 @@ repos: - id: check-case-conflict - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 16a6ad2fead09286ee6eb6b0a3fab55655a6c22a # frozen: 0.35.0 + rev: b035497fb64e3f9faa91e833331688cc185891e6 # frozen: 0.36.0 hooks: - id: check-github-workflows - repo: https://github.com/maresb/check-json5 - rev: 893a2b5a0a27c3540bd8fcafe2968ccc05237179 # 1.0 + rev: bd4737432a2175617a9eeaa510ab369cbc1cbd3d # frozen: v1.0.1 hooks: - id: check-json5 files: | @@ -249,7 +249,7 @@ repos: description: Runs hadolint to lint Dockerfiles - repo: https://github.com/astral-sh/ruff-pre-commit - rev: 1a1f58ba4c35362efe8fed2279715a905baee93d # frozen: v0.14.8 + rev: 5ba58aca0bd5bc7c0e1c0fc45af2e88d6a2bde83 # frozen: v0.14.10 hooks: - id: ruff name: ruff-src From 6432ebee3466513fc5136d80bf9e4c81454c089c Mon Sep 17 00:00:00 2001 From: Eli Fine Date: Mon, 5 Jan 2026 19:43:02 +0000 Subject: [PATCH 12/16] template --- template/.pre-commit-config.yaml.jinja | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/template/.pre-commit-config.yaml.jinja b/template/.pre-commit-config.yaml.jinja index 263182e98..27e0b7c1b 100644 --- a/template/.pre-commit-config.yaml.jinja +++ b/template/.pre-commit-config.yaml.jinja @@ -41,7 +41,7 @@ repos: # Reformatting (should generally come before any file format or other checks, because reformatting can change things) - repo: https://github.com/crate-ci/typos - rev: 802d5794ff9cf7b15610c47eca99cd1ab757d8d4 # frozen: v1 + rev: b31d3aa6e8e43e6a9cf7a1d137baf189dec0922b # frozen: v1 hooks: - id: typos exclude: | @@ -194,12 +194,12 @@ repos: - id: check-case-conflict - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 16a6ad2fead09286ee6eb6b0a3fab55655a6c22a # frozen: 0.35.0 + rev: b035497fb64e3f9faa91e833331688cc185891e6 # frozen: 0.36.0 hooks: - id: check-github-workflows - repo: https://github.com/maresb/check-json5 - rev: 893a2b5a0a27c3540bd8fcafe2968ccc05237179 # 1.0 + rev: bd4737432a2175617a9eeaa510ab369cbc1cbd3d # frozen: v1.0.1 hooks: - id: check-json5 files: | @@ -276,7 +276,7 @@ repos: description: Runs hadolint to lint Dockerfiles - repo: https://github.com/astral-sh/ruff-pre-commit - rev: 1a1f58ba4c35362efe8fed2279715a905baee93d # frozen: v0.14.8 + rev: 5ba58aca0bd5bc7c0e1c0fc45af2e88d6a2bde83 # frozen: v0.14.10 hooks: - id: ruff name: ruff-src From f084fdc06e2b1e2335c534ca2b48ebdba6cad93d Mon Sep 17 00:00:00 2001 From: Eli Fine Date: Mon, 5 Jan 2026 20:48:03 +0000 Subject: [PATCH 13/16] pulumi --- .copier-answers.yml | 2 +- extensions/context.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 22c2e5540..673da1556 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier -_commit: v0.0.91-17-g90f4ab9 +_commit: v0.0.91-18-ga6b5c07 _src_path: gh:LabAutomationAndScreening/copier-base-template.git description: A web app that is hosted within a local intranet. Nuxt frontend, python backend, docker-compose diff --git a/extensions/context.py b/extensions/context.py index 73b9b9e63..c7f52c2f1 100644 --- a/extensions/context.py +++ b/extensions/context.py @@ -21,7 +21,7 @@ def hook(self, context: dict[Any, Any]) -> dict[Any, Any]: context["copier_version"] = "==9.11.0" context["copier_template_extensions_version"] = "==0.3.3" context["sphinx_version"] = "9.0.4" - context["pulumi_version"] = ">=3.214.4" + context["pulumi_version"] = ">=3.214.1" context["pulumi_aws_version"] = ">=7.15.0" context["pulumi_aws_native_version"] = ">=1.47.0" context["pulumi_command_version"] = ">=1.1.3" From d138cc0efaa44024177274c9486e12eb6731b9e9 Mon Sep 17 00:00:00 2001 From: Eli Fine Date: Mon, 5 Jan 2026 20:58:54 +0000 Subject: [PATCH 14/16] vitest --- .copier-answers.yml | 2 +- template/.devcontainer/devcontainer.json.jinja | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 673da1556..768b5152a 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier -_commit: v0.0.91-18-ga6b5c07 +_commit: v0.0.91-19-g7760622 _src_path: gh:LabAutomationAndScreening/copier-base-template.git description: A web app that is hosted within a local intranet. Nuxt frontend, python backend, docker-compose diff --git a/template/.devcontainer/devcontainer.json.jinja b/template/.devcontainer/devcontainer.json.jinja index 00518535e..183f66cac 100644 --- a/template/.devcontainer/devcontainer.json.jinja +++ b/template/.devcontainer/devcontainer.json.jinja @@ -44,7 +44,7 @@ {% endraw %}{% if is_child_of_copier_base_template is not defined and template_uses_vuejs is defined and template_uses_vuejs is sameas(true) %}{% raw %} // VueJS "vue.volar@3.2.1", - "vitest.explorer@1.16.0", + "vitest.explorer@1.36.0", {% endraw %}{% endif %}{% raw %}{% endraw %}{% if is_child_of_copier_base_template is not defined and template_uses_javascript is defined and template_uses_javascript is sameas(true) %}{% raw %} // All javascript "dbaeumer.vscode-eslint@3.0.21", From 532d2ad40a985082cb3678cd5aef476b46fda385 Mon Sep 17 00:00:00 2001 From: Eli Fine Date: Mon, 5 Jan 2026 21:09:44 +0000 Subject: [PATCH 15/16] simplify --- .copier-answers.yml | 2 +- template/.devcontainer/devcontainer.json.jinja | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 768b5152a..e4da29622 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier -_commit: v0.0.91-19-g7760622 +_commit: v0.0.91-20-g29ddd57 _src_path: gh:LabAutomationAndScreening/copier-base-template.git description: A web app that is hosted within a local intranet. Nuxt frontend, python backend, docker-compose diff --git a/template/.devcontainer/devcontainer.json.jinja b/template/.devcontainer/devcontainer.json.jinja index 183f66cac..7b8ed9727 100644 --- a/template/.devcontainer/devcontainer.json.jinja +++ b/template/.devcontainer/devcontainer.json.jinja @@ -17,7 +17,7 @@ }{% endraw %}{% if is_child_of_copier_base_template is not defined and template_uses_javascript is defined and template_uses_javascript is sameas(true) %}{% raw %}, "ghcr.io/devcontainers/features/node:1.6.3": { // https://github.com/devcontainers/features/tree/main/src/node - "version": "{% endraw %}{% if is_child_of_copier_base_template is not defined %}{{ node_version }}{% else %}{{ default_node_version }}{% endif %}{% raw %}", + "version": "{% endraw %}{{ node_version }}{% raw %}", "pnpmVersion": "{% endraw %}{{ pnpm_version }}{% raw %}" }{% endraw %}{% endif %}{% raw %}{% endraw %}{% if install_claude_cli %}{% raw %}, "ghcr.io/anthropics/devcontainer-features/claude-code:1.0.5": {}{% endraw %}{% endif %}{% raw %} From e5a3dd62ec5244a46c092670d181ce7d5a250842 Mon Sep 17 00:00:00 2001 From: Eli Fine Date: Mon, 5 Jan 2026 21:16:18 +0000 Subject: [PATCH 16/16] tag --- .copier-answers.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index e4da29622..8caf381ef 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier -_commit: v0.0.91-20-g29ddd57 +_commit: v0.0.92 _src_path: gh:LabAutomationAndScreening/copier-base-template.git description: A web app that is hosted within a local intranet. Nuxt frontend, python backend, docker-compose