normalize/dedupe files for programmer tool
This commit is contained in:
parent
972ea5284a
commit
1084faaf0b
|
|
@ -1,4 +1,5 @@
|
||||||
import os
|
import os
|
||||||
|
import os
|
||||||
import sys
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Dict, List, Union
|
from typing import Dict, List, Union
|
||||||
|
|
@ -77,13 +78,6 @@ def run_programming_task(
|
||||||
|
|
||||||
Returns: { "output": stdout+stderr, "return_code": 0 if success, "success": True/False }
|
Returns: { "output": stdout+stderr, "return_code": 0 if success, "success": True/False }
|
||||||
"""
|
"""
|
||||||
# Get related files if no specific files provided
|
|
||||||
file_paths = (
|
|
||||||
list(_global_memory["related_files"].values())
|
|
||||||
if "related_files" in _global_memory
|
|
||||||
else []
|
|
||||||
)
|
|
||||||
|
|
||||||
# Build command
|
# Build command
|
||||||
aider_exe = get_aider_executable()
|
aider_exe = get_aider_executable()
|
||||||
command = [
|
command = [
|
||||||
|
|
@ -96,6 +90,13 @@ def run_programming_task(
|
||||||
"--no-check-update",
|
"--no-check-update",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Get combined list of files (explicit + related) with normalized paths
|
||||||
|
# and deduplicated using set operations
|
||||||
|
files_to_use = list({os.path.abspath(f) for f in (files or [])} | {
|
||||||
|
os.path.abspath(f) for f in _global_memory["related_files"].values()
|
||||||
|
if "related_files" in _global_memory
|
||||||
|
})
|
||||||
|
|
||||||
# Add config file if specified
|
# Add config file if specified
|
||||||
if "config" in _global_memory and _global_memory["config"].get("aider_config"):
|
if "config" in _global_memory and _global_memory["config"].get("aider_config"):
|
||||||
command.extend(["--config", _global_memory["config"]["aider_config"]])
|
command.extend(["--config", _global_memory["config"]["aider_config"]])
|
||||||
|
|
@ -112,9 +113,6 @@ def run_programming_task(
|
||||||
command.append("-m")
|
command.append("-m")
|
||||||
|
|
||||||
command.append(instructions)
|
command.append(instructions)
|
||||||
|
|
||||||
# Add files to command
|
|
||||||
files_to_use = file_paths + (files or [])
|
|
||||||
if files_to_use:
|
if files_to_use:
|
||||||
command.extend(files_to_use)
|
command.extend(files_to_use)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import pytest
|
import pytest
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from langchain_core.tools import Tool
|
||||||
|
|
||||||
from ra_aid.tools.programmer import parse_aider_flags, run_programming_task, get_aider_executable
|
from ra_aid.tools.programmer import parse_aider_flags, run_programming_task, get_aider_executable
|
||||||
|
|
||||||
|
|
@ -88,7 +89,7 @@ def test_aider_config_flag(mocker):
|
||||||
"ra_aid.tools.programmer.run_interactive_command", return_value=(b"", 0)
|
"ra_aid.tools.programmer.run_interactive_command", return_value=(b"", 0)
|
||||||
)
|
)
|
||||||
|
|
||||||
run_programming_task("test instruction")
|
run_programming_task.invoke({"instructions": "test instruction"})
|
||||||
|
|
||||||
args = mock_run.call_args[0][0] # Get the first positional arg (command list)
|
args = mock_run.call_args[0][0] # Get the first positional arg (command list)
|
||||||
assert "--config" in args
|
assert "--config" in args
|
||||||
|
|
@ -96,6 +97,43 @@ def test_aider_config_flag(mocker):
|
||||||
assert args[config_index + 1] == "/path/to/config.yml"
|
assert args[config_index + 1] == "/path/to/config.yml"
|
||||||
|
|
||||||
|
|
||||||
|
def test_path_normalization_and_deduplication(mocker, tmp_path):
|
||||||
|
"""Test path normalization and deduplication in run_programming_task."""
|
||||||
|
# Create a temporary test file
|
||||||
|
test_file = tmp_path / "test.py"
|
||||||
|
test_file.write_text("")
|
||||||
|
new_file = tmp_path / "new.py"
|
||||||
|
|
||||||
|
# Mock dependencies
|
||||||
|
mocker.patch("ra_aid.tools.programmer._global_memory", {"related_files": {}})
|
||||||
|
mocker.patch("ra_aid.tools.programmer.get_aider_executable", return_value="/path/to/aider")
|
||||||
|
mock_run = mocker.patch("ra_aid.tools.programmer.run_interactive_command", return_value=(b"", 0))
|
||||||
|
|
||||||
|
# Test duplicate paths
|
||||||
|
run_programming_task.invoke({
|
||||||
|
"instructions": "test instruction",
|
||||||
|
"files": [str(test_file), str(test_file)] # Same path twice
|
||||||
|
})
|
||||||
|
|
||||||
|
# Get the command list passed to run_interactive_command
|
||||||
|
cmd_args = mock_run.call_args[0][0]
|
||||||
|
# Count occurrences of test_file path in command
|
||||||
|
test_file_count = sum(1 for arg in cmd_args if arg == str(test_file))
|
||||||
|
assert test_file_count == 1, "Expected exactly one instance of test_file path"
|
||||||
|
|
||||||
|
# Test mixed paths
|
||||||
|
run_programming_task.invoke({
|
||||||
|
"instructions": "test instruction",
|
||||||
|
"files": [str(test_file), str(new_file)] # Two different paths
|
||||||
|
})
|
||||||
|
|
||||||
|
# Get the command list from the second call
|
||||||
|
cmd_args = mock_run.call_args[0][0]
|
||||||
|
# Verify both paths are present exactly once
|
||||||
|
assert sum(1 for arg in cmd_args if arg == str(test_file)) == 1, "Expected one instance of test_file"
|
||||||
|
assert sum(1 for arg in cmd_args if arg == str(new_file)) == 1, "Expected one instance of new_file"
|
||||||
|
|
||||||
|
|
||||||
def test_get_aider_executable(mocker):
|
def test_get_aider_executable(mocker):
|
||||||
"""Test the get_aider_executable function."""
|
"""Test the get_aider_executable function."""
|
||||||
mock_sys = mocker.patch("ra_aid.tools.programmer.sys")
|
mock_sys = mocker.patch("ra_aid.tools.programmer.sys")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue