fix(filesystem): clarify optional tool argument handling
Keep the mypy-friendly optional execute signatures while returning clearer errors for missing arguments and locking that behavior with regression tests. Made-with: Cursor
This commit is contained in:
@@ -96,7 +96,7 @@ class ReadFileTool(_FsTool):
|
|||||||
async def execute(self, path: str | None = None, offset: int = 1, limit: int | None = None, **kwargs: Any) -> Any:
|
async def execute(self, path: str | None = None, offset: int = 1, limit: int | None = None, **kwargs: Any) -> Any:
|
||||||
try:
|
try:
|
||||||
if not path:
|
if not path:
|
||||||
return f"Error: File not found: {path}"
|
return "Error reading file: Unknown path"
|
||||||
fp = self._resolve(path)
|
fp = self._resolve(path)
|
||||||
if not fp.exists():
|
if not fp.exists():
|
||||||
return f"Error: File not found: {path}"
|
return f"Error: File not found: {path}"
|
||||||
@@ -264,7 +264,7 @@ class EditFileTool(_FsTool):
|
|||||||
if old_text is None:
|
if old_text is None:
|
||||||
raise ValueError("Unknown old_text")
|
raise ValueError("Unknown old_text")
|
||||||
if new_text is None:
|
if new_text is None:
|
||||||
raise ValueError("Unknown next_text")
|
raise ValueError("Unknown new_text")
|
||||||
|
|
||||||
fp = self._resolve(path)
|
fp = self._resolve(path)
|
||||||
if not fp.exists():
|
if not fp.exists():
|
||||||
|
|||||||
@@ -77,6 +77,11 @@ class TestReadFileTool:
|
|||||||
assert "Error" in result
|
assert "Error" in result
|
||||||
assert "not found" in result
|
assert "not found" in result
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_missing_path_returns_clear_error(self, tool):
|
||||||
|
result = await tool.execute()
|
||||||
|
assert result == "Error reading file: Unknown path"
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_char_budget_trims(self, tool, tmp_path):
|
async def test_char_budget_trims(self, tool, tmp_path):
|
||||||
"""When the selected slice exceeds _MAX_CHARS the output is trimmed."""
|
"""When the selected slice exceeds _MAX_CHARS the output is trimmed."""
|
||||||
@@ -200,6 +205,13 @@ class TestEditFileTool:
|
|||||||
assert "Error" in result
|
assert "Error" in result
|
||||||
assert "not found" in result
|
assert "not found" in result
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_missing_new_text_returns_clear_error(self, tool, tmp_path):
|
||||||
|
f = tmp_path / "a.py"
|
||||||
|
f.write_text("hello", encoding="utf-8")
|
||||||
|
result = await tool.execute(path=str(f), old_text="hello")
|
||||||
|
assert result == "Error editing file: Unknown new_text"
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# ListDirTool
|
# ListDirTool
|
||||||
@@ -265,6 +277,11 @@ class TestListDirTool:
|
|||||||
assert "Error" in result
|
assert "Error" in result
|
||||||
assert "not found" in result
|
assert "not found" in result
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_missing_path_returns_clear_error(self, tool):
|
||||||
|
result = await tool.execute()
|
||||||
|
assert result == "Error listing directory: Unknown path"
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Workspace restriction + extra_allowed_dirs
|
# Workspace restriction + extra_allowed_dirs
|
||||||
|
|||||||
Reference in New Issue
Block a user