fix: expanduser in project_root, remove redundant cwd, add tests
- get_myclaude_project_root() now expands ~ in MYCLAUDE_PROJECT_ROOT (was resolving to ./~/path instead of $HOME/path) - Extract hardcoded 16/8 depth limits as _MAX_WALK_DEPTH / _MAX_SOURCE_DEPTH - Remove redundant cwd= from _run_pip_editable (already specified via -e) - Add test_cwd_invalid_directory and test_env_var_expands_tilde - Remove incorrect test_extra_args_forwarded (click.Group does not support forwarding arbitrary args; ctx.args is always empty)
This commit is contained in:
@@ -23,7 +23,7 @@ def _run_make_install(root: Path) -> int:
|
|||||||
|
|
||||||
def _run_pip_editable(root: Path) -> int:
|
def _run_pip_editable(root: Path) -> int:
|
||||||
cmd = [sys.executable, "-m", "pip", "install", "-e", str(root)]
|
cmd = [sys.executable, "-m", "pip", "install", "-e", str(root)]
|
||||||
return subprocess.run(cmd, cwd=str(root), check=False).returncode
|
return subprocess.run(cmd, check=False).returncode
|
||||||
|
|
||||||
|
|
||||||
@click.command("update")
|
@click.command("update")
|
||||||
|
|||||||
+6
-3
@@ -3,6 +3,9 @@
|
|||||||
import os
|
import os
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
_MAX_WALK_DEPTH = 16
|
||||||
|
_MAX_SOURCE_DEPTH = 8
|
||||||
|
|
||||||
|
|
||||||
def _pyproject_names_myclaude(path: Path) -> bool:
|
def _pyproject_names_myclaude(path: Path) -> bool:
|
||||||
try:
|
try:
|
||||||
@@ -14,7 +17,7 @@ def _pyproject_names_myclaude(path: Path) -> bool:
|
|||||||
|
|
||||||
def _walk_up_for_pyproject(start: Path) -> Path | None:
|
def _walk_up_for_pyproject(start: Path) -> Path | None:
|
||||||
p = start.resolve()
|
p = start.resolve()
|
||||||
for _ in range(16):
|
for _ in range(_MAX_WALK_DEPTH):
|
||||||
candidate = p / "pyproject.toml"
|
candidate = p / "pyproject.toml"
|
||||||
if candidate.is_file() and _pyproject_names_myclaude(candidate):
|
if candidate.is_file() and _pyproject_names_myclaude(candidate):
|
||||||
return p
|
return p
|
||||||
@@ -33,7 +36,7 @@ def get_myclaude_project_root() -> Path:
|
|||||||
"""
|
"""
|
||||||
env_root = os.environ.get("MYCLAUDE_PROJECT_ROOT")
|
env_root = os.environ.get("MYCLAUDE_PROJECT_ROOT")
|
||||||
if env_root:
|
if env_root:
|
||||||
return Path(env_root).resolve()
|
return Path(env_root).expanduser().resolve()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
cwd = Path.cwd()
|
cwd = Path.cwd()
|
||||||
@@ -45,7 +48,7 @@ def get_myclaude_project_root() -> Path:
|
|||||||
return found
|
return found
|
||||||
|
|
||||||
here = Path(__file__).resolve().parent
|
here = Path(__file__).resolve().parent
|
||||||
for _ in range(8):
|
for _ in range(_MAX_SOURCE_DEPTH):
|
||||||
pyproject = here / "pyproject.toml"
|
pyproject = here / "pyproject.toml"
|
||||||
if pyproject.is_file() and _pyproject_names_myclaude(pyproject):
|
if pyproject.is_file() and _pyproject_names_myclaude(pyproject):
|
||||||
return here
|
return here
|
||||||
|
|||||||
@@ -99,3 +99,12 @@ class TestCliDefaultBehavior:
|
|||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
call_args = mock_run.call_args[0][0]
|
call_args = mock_run.call_args[0][0]
|
||||||
assert "--dangerously-skip-permissions" in call_args
|
assert "--dangerously-skip-permissions" in call_args
|
||||||
|
|
||||||
|
def test_cwd_invalid_directory(self, tmp_path: Path) -> None:
|
||||||
|
"""--cwd pointing to non-existent directory should error."""
|
||||||
|
runner = CliRunner()
|
||||||
|
bad_dir = tmp_path / "does_not_exist"
|
||||||
|
|
||||||
|
result = runner.invoke(cli, ["--cwd", str(bad_dir)])
|
||||||
|
assert result.exit_code == 1
|
||||||
|
assert "not a directory" in result.output.lower()
|
||||||
|
|||||||
@@ -20,6 +20,24 @@ class TestGetMyclaudeProjectRoot:
|
|||||||
result = get_myclaude_project_root()
|
result = get_myclaude_project_root()
|
||||||
assert result == fake_root.resolve()
|
assert result == fake_root.resolve()
|
||||||
|
|
||||||
|
def test_env_var_expands_tilde(self, tmp_path: Path) -> None:
|
||||||
|
"""MYCLAUDE_PROJECT_ROOT should expand ~ to home directory."""
|
||||||
|
home = tmp_path / "home"
|
||||||
|
home.mkdir()
|
||||||
|
fake_root = home / "fake_repo"
|
||||||
|
fake_root.mkdir()
|
||||||
|
(fake_root / "pyproject.toml").write_text('name = "myclaude"\n')
|
||||||
|
|
||||||
|
with patch.dict(
|
||||||
|
os.environ,
|
||||||
|
{
|
||||||
|
"MYCLAUDE_PROJECT_ROOT": "~/fake_repo",
|
||||||
|
"HOME": str(home),
|
||||||
|
},
|
||||||
|
):
|
||||||
|
result = get_myclaude_project_root()
|
||||||
|
assert result == fake_root.resolve()
|
||||||
|
|
||||||
def test_fallback_when_not_in_repo(self) -> None:
|
def test_fallback_when_not_in_repo(self) -> None:
|
||||||
"""When not in a repo, fallback to ~/.myclaude."""
|
"""When not in a repo, fallback to ~/.myclaude."""
|
||||||
with (
|
with (
|
||||||
|
|||||||
Reference in New Issue
Block a user