"""包基线:版本号双写一致,以及 import 本库不会把网关拉起来。 **这个文件读源码文本和 `pyproject.toml`,不是只跑被测代码。** 它仍然属于 unit,因为 分层判据是「依赖什么」(`CLAUDE.md` §1.9),而它不连任何外部服务。 """ import subprocess import sys import tomllib from pathlib import Path import pytest import polyloop REPO_ROOT = Path(__file__).resolve().parents[2] pytestmark = pytest.mark.unit def test_version_matches_pyproject() -> None: """`__version__` 与 `pyproject.toml` 的 version 必须一致。 两处双写是刻意的(见 `polyloop/__init__.py`),代价就是会漂移,所以用这条断言钉住。 漂移的表现是下游报 bug 时说的版本号和实际装的不是一个,而那种错查起来要绕很远。 """ declared = tomllib.loads((REPO_ROOT / "pyproject.toml").read_text(encoding="utf-8")) assert polyloop.__version__ == declared["project"]["version"] def test_importing_polyloop_does_not_import_polygateway() -> None: """依赖规则 9:`import polyloop` 之后 `sys.modules` 里不许出现 `polygateway`。 这条写不成 import-linter 契约——它是运行时事实,不是静态图上的边。适配器模块允许 import 网关(规则 5),所以静态图上那条边合法;这里要禁的是**顶层 import 时就把它 拉起来**。一个顺手提供的默认模型客户端会让每个进程在 import 本库时,把网关连同它的 provider 目录一起加载。 在子进程里跑,因为本进程早就 import 过别的东西了,`sys.modules` 不干净。 """ code = "import polyloop, sys; print('polygateway' in sys.modules)" result = subprocess.run( # noqa: S603 [sys.executable, "-c", code], capture_output=True, text=True, check=True, cwd=REPO_ROOT, ) assert result.stdout.strip() == "False", result.stdout def test_importing_polyloop_does_not_import_pytest() -> None: """`import polyloop` 之后 `sys.modules` 里不许出现 `pytest`。 契约套件 `polyloop.testing` 顶层就 import pytest,而顶层包不 re-export 它——它和 `stores`、`adapters` 同一档,必须显式 import。少了这条断言,哪天有人顺手把 `testing` 加进 `polyloop/__init__.py`,每个下游的运行时就都被拽上一个 pytest 依赖,而 pytest 在 生产环境里通常根本没装,表现是下游一 import 本库就 `ModuleNotFoundError`。 和上面那条 polygateway 同构,也同样在子进程里跑:本进程早就 import 过 pytest 了。 """ code = "import polyloop, sys; print('pytest' in sys.modules)" result = subprocess.run( # noqa: S603 [sys.executable, "-c", code], capture_output=True, text=True, check=True, cwd=REPO_ROOT, ) assert result.stdout.strip() == "False", result.stdout def test_py_typed_marker_ships_with_the_package() -> None: """`py.typed` 必须在包根里。 少了它,下游的类型检查器把整个包当成无注解的黑盒——而这个库对下游的承诺大半写在 签名里。这个文件是空的,很容易在某次移动目录时丢掉且不报错。 """ assert (REPO_ROOT / "src" / "polyloop" / "py.typed").is_file()