mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-15 23:31:29 +00:00
Claude Code reads settings.json from CLAUDE_CONFIG_DIR when it is set, while lite login --config-claude wrote to ~/.claude/settings.json and lite claude checked that same file for its apiKeyHelper. With the override set, lite could drop ANTHROPIC_AUTH_TOKEN because the helper lives in a file Claude Code never reads, leaving it with no key at all. claude_settings_path(environ) now picks the file the way Claude Code does, and both commands go through it. The CLI test directory gets an autouse conftest that isolates HOME, USERPROFILE, and CLAUDE_CONFIG_DIR per test and fails any test that writes the developer's real settings.json, restoring it first.
32 lines
1.1 KiB
Python
32 lines
1.1 KiB
Python
import os
|
|
from collections.abc import Iterator
|
|
from pathlib import Path
|
|
from typing import Final
|
|
|
|
import pytest
|
|
|
|
REAL_CLAUDE_SETTINGS: Final = Path(os.path.expanduser("~")) / ".claude" / "settings.json"
|
|
|
|
|
|
def _current_bytes() -> bytes | None:
|
|
return REAL_CLAUDE_SETTINGS.read_bytes() if REAL_CLAUDE_SETTINGS.exists() else None
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def isolated_claude_home(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> Iterator[Path]:
|
|
before: Final = _current_bytes()
|
|
monkeypatch.setenv("HOME", str(tmp_path))
|
|
monkeypatch.setenv("USERPROFILE", str(tmp_path))
|
|
monkeypatch.setenv("CLAUDE_CONFIG_DIR", str(tmp_path / ".claude"))
|
|
yield tmp_path
|
|
after: Final = _current_bytes()
|
|
if after == before:
|
|
return
|
|
if before is None:
|
|
REAL_CLAUDE_SETTINGS.unlink()
|
|
else:
|
|
REAL_CLAUDE_SETTINGS.write_bytes(before)
|
|
pytest.fail(
|
|
f"this test wrote the developer's real {REAL_CLAUDE_SETTINGS}; the original bytes were restored. "
|
|
"Resolve the Claude settings path at call time (never Path.home() at import) and point the test at tmp_path"
|
|
)
|