mirror of
https://github.com/langchain-ai/deepagents.git
synced 2026-07-21 09:15:22 -04:00
cac3fd377b
Reduces the "green-local / red-CI" friction for `libs/code` contributors. Adds a single `make bootstrap` (sync deps + install git hooks) and `make check` (run the CI gauntlet locally: lint, types, imports, tests, plus the cross-cutting repo gates). Also closes two pre-commit gaps where the `extras-sync` hook only covered `libs/cli` and the `deepagents` SDK pin had no local check at all (the new check is advisory, matching the existing workflow's nature). Made by [Open SWE](https://openswe.vercel.app) --------- Co-authored-by: open-swe[bot] <open-swe@users.noreply.github.com>
68 lines
2.4 KiB
Python
68 lines
2.4 KiB
Python
"""Tests for check_extras_sync main() checks and multi-path run() aggregation."""
|
|
|
|
from pathlib import Path
|
|
|
|
from check_extras_sync import main, run
|
|
|
|
|
|
def _write(path: Path, *, required: str, optional: str | None = None) -> Path:
|
|
"""Write a minimal pyproject.toml with the given required/optional deps."""
|
|
body = f'[project]\nname = "x"\nversion = "0.1.0"\ndependencies = [{required}]\n'
|
|
if optional is not None:
|
|
body += f"[project.optional-dependencies]\nall = [{optional}]\n"
|
|
path.write_text(body)
|
|
return path
|
|
|
|
|
|
def test_main_in_sync(tmp_path) -> None:
|
|
"""An extra whose version matches the required dep passes."""
|
|
pyproject = _write(
|
|
tmp_path / "pyproject.toml", required='"httpx>=1.0"', optional='"httpx>=1.0"'
|
|
)
|
|
assert main(pyproject) == 0
|
|
|
|
|
|
def test_main_mismatch(tmp_path) -> None:
|
|
"""An extra whose version drifts from the required dep fails."""
|
|
pyproject = _write(
|
|
tmp_path / "pyproject.toml", required='"httpx>=1.0"', optional='"httpx>=2.0"'
|
|
)
|
|
assert main(pyproject) == 1
|
|
|
|
|
|
def test_main_no_optional_dependencies(tmp_path) -> None:
|
|
"""A package without optional extras passes trivially."""
|
|
pyproject = _write(tmp_path / "pyproject.toml", required='"httpx>=1.0"')
|
|
assert main(pyproject) == 0
|
|
|
|
|
|
def test_run_all_paths_in_sync(tmp_path) -> None:
|
|
"""`run` returns 0 when every path is in sync."""
|
|
a = _write(tmp_path / "a.toml", required='"httpx>=1.0"', optional='"httpx>=1.0"')
|
|
b = _write(tmp_path / "b.toml", required='"rich>=15"')
|
|
assert run([str(a), str(b)]) == 0
|
|
|
|
|
|
def test_run_aggregates_failure_without_short_circuit(tmp_path) -> None:
|
|
"""`run` returns 1 if any path fails, checking every path.
|
|
|
|
The good path is first so a buggy implementation that returns the first
|
|
path's result (rather than aggregating) would wrongly return 0.
|
|
"""
|
|
good = _write(
|
|
tmp_path / "good.toml", required='"httpx>=1.0"', optional='"httpx>=1.0"'
|
|
)
|
|
bad = _write(
|
|
tmp_path / "bad.toml", required='"httpx>=1.0"', optional='"httpx>=2.0"'
|
|
)
|
|
assert run([str(good), str(bad)]) == 1
|
|
|
|
|
|
def test_run_defaults_to_pyproject(tmp_path, monkeypatch) -> None:
|
|
"""With no args, `run` checks ./pyproject.toml in the working directory."""
|
|
_write(
|
|
tmp_path / "pyproject.toml", required='"httpx>=1.0"', optional='"httpx>=1.0"'
|
|
)
|
|
monkeypatch.chdir(tmp_path)
|
|
assert run([]) == 0
|