From 04906debfab2b5a8ddaf5a912a3a750621797d4c Mon Sep 17 00:00:00 2001 From: GeneAI Date: Wed, 20 May 2026 20:55:26 -0400 Subject: [PATCH] test: switch zero-dep install tests to uv venv stdlib `venv.create(..., with_pip=True)` calls `python -m ensurepip` inside the new venv, which aborts with SIGABRT on cpython 3.11.14 macOS-aarch64. None of the 5 tests in test_zero_dep_install.py could run as a result. Switch to `uv venv` + `uv pip install --python `. uv has its own resolver and does not depend on ensurepip, so it works on this Python build, runs faster, and matches the rest of the project's tooling. Skip the suite (rather than fail) on machines without uv. Co-Authored-By: Claude Opus 4.7 --- tests/test_zero_dep_install.py | 61 +++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/tests/test_zero_dep_install.py b/tests/test_zero_dep_install.py index 6fe4366..2e0617b 100644 --- a/tests/test_zero_dep_install.py +++ b/tests/test_zero_dep_install.py @@ -9,42 +9,60 @@ This guards the architectural contract documented in ``tech.md`` ADR-002. Marked ``slow`` because it creates a real venv. + +Uses ``uv venv`` + ``uv pip`` rather than stdlib ``venv``/``pip`` because +``ensurepip`` aborts on some Python builds (observed on cpython 3.11.14 +macOS-aarch64). """ from __future__ import annotations +import shutil import subprocess import sys -import venv from pathlib import Path import pytest REPO_ROOT = Path(__file__).resolve().parent.parent +_UV = shutil.which("uv") -@pytest.mark.slow -@pytest.mark.skipif( - sys.platform.startswith("win"), - reason="venv layout differs on Windows; covered on Linux/macOS", +_requires_uv = pytest.mark.skipif( + _UV is None, + reason="uv is required to build the isolated test venv (stdlib ensurepip is unreliable)", ) -def test_attune_help_imports_without_authoring_extra(tmp_path: Path) -> None: - venv_dir = tmp_path / "venv" - venv.create(venv_dir, with_pip=True) - py = venv_dir / "bin" / "python" - pip = venv_dir / "bin" / "pip" + +def _make_venv(venv_dir: Path) -> Path: + """Create a venv at ``venv_dir`` via ``uv venv`` and return its python.""" subprocess.run( - [str(pip), "install", "--quiet", "python-frontmatter"], + [_UV, "venv", "--quiet", str(venv_dir)], check=True, capture_output=True, ) + return venv_dir / "bin" / "python" + + +def _install(py: Path, *args: str) -> None: subprocess.run( - [str(pip), "install", "--quiet", "--no-deps", "-e", str(REPO_ROOT)], + [_UV, "pip", "install", "--quiet", "--python", str(py), *args], check=True, capture_output=True, ) + +@pytest.mark.slow +@_requires_uv +@pytest.mark.skipif( + sys.platform.startswith("win"), + reason="venv layout differs on Windows; covered on Linux/macOS", +) +def test_attune_help_imports_without_authoring_extra(tmp_path: Path) -> None: + py = _make_venv(tmp_path / "venv") + _install(py, "python-frontmatter") + _install(py, "--no-deps", "-e", str(REPO_ROOT)) + base = subprocess.run( [str(py), "-c", "import attune_help; print('ok')"], capture_output=True, @@ -55,6 +73,7 @@ def test_attune_help_imports_without_authoring_extra(tmp_path: Path) -> None: @pytest.mark.slow +@_requires_uv @pytest.mark.skipif( sys.platform.startswith("win"), reason="venv layout differs on Windows; covered on Linux/macOS", @@ -69,21 +88,9 @@ def test_attune_help_imports_without_authoring_extra(tmp_path: Path) -> None: ], ) def test_shim_imports_fail_helpfully_without_authoring(tmp_path: Path, shim_module: str) -> None: - venv_dir = tmp_path / "venv" - venv.create(venv_dir, with_pip=True) - py = venv_dir / "bin" / "python" - pip = venv_dir / "bin" / "pip" - - subprocess.run( - [str(pip), "install", "--quiet", "python-frontmatter"], - check=True, - capture_output=True, - ) - subprocess.run( - [str(pip), "install", "--quiet", "--no-deps", "-e", str(REPO_ROOT)], - check=True, - capture_output=True, - ) + py = _make_venv(tmp_path / "venv") + _install(py, "python-frontmatter") + _install(py, "--no-deps", "-e", str(REPO_ROOT)) result = subprocess.run( [str(py), "-c", f"import {shim_module}"],