diff --git a/aider/coders/editblock_coder.py b/aider/coders/editblock_coder.py index 0683daeaf..bbc5bcae5 100644 --- a/aider/coders/editblock_coder.py +++ b/aider/coders/editblock_coder.py @@ -532,12 +532,9 @@ def find_filename(lines, fence, valid_fnames): if not line.startswith(fence[0]): break - if not len(filenames): + if not filenames: return - if len(filenames) == 1: - return filenames[0] - # pick the *best* filename found # Check for exact match first @@ -553,7 +550,7 @@ def find_filename(lines, fence, valid_fnames): # Perform fuzzy matching with valid_fnames for fname in filenames: - close_matches = difflib.get_close_matches(fname, valid_fnames, n=1, cutoff=0.6) + close_matches = difflib.get_close_matches(fname, valid_fnames, n=1, cutoff=0.8) if len(close_matches) == 1: return close_matches[0] @@ -562,7 +559,8 @@ def find_filename(lines, fence, valid_fnames): if "." in fname: return fname - return filenames[0] if filenames else None + if filenames: + return filenames[0] def find_similar_lines(search_lines, content_lines, threshold=0.6): diff --git a/tests/basic/test_editblock.py b/tests/basic/test_editblock.py index 1b099553c..61d3c8668 100644 --- a/tests/basic/test_editblock.py +++ b/tests/basic/test_editblock.py @@ -18,23 +18,19 @@ class TestUtils(unittest.TestCase): def test_find_filename(self): fence = ("```", "```") - valid_fnames = ["file1.py", "file2.py", "dir/file3.py"] + valid_fnames = ["file1.py", "file2.py", "dir/file3.py", "\windows\__init__.py"] # Test with filename on a single line lines = ["file1.py", "```"] self.assertEqual(eb.find_filename(lines, fence, valid_fnames), "file1.py") - # Test with filename and fence on separate lines - lines = ["file2.py", "```", "some content"] - self.assertEqual(eb.find_filename(lines, fence, valid_fnames), "file2.py") - # Test with filename in fence lines = ["```python", "file3.py", "```"] self.assertEqual(eb.find_filename(lines, fence, valid_fnames), "dir/file3.py") # Test with no valid filename lines = ["```", "invalid_file.py", "```"] - self.assertIsNone(eb.find_filename(lines, fence, valid_fnames)) + self.assertEqual("invalid_file.py", eb.find_filename(lines, fence, valid_fnames)) # Test with multiple fences lines = ["```python", "file1.py", "```", "```", "file2.py", "```"] @@ -48,6 +44,10 @@ class TestUtils(unittest.TestCase): lines = ["file1_py", "```"] self.assertEqual(eb.find_filename(lines, fence, valid_fnames), "file1.py") + # Test with fuzzy matching + lines = ["\windows__init__.py", "```"] + self.assertEqual(eb.find_filename(lines, fence, valid_fnames), "\windows\__init__.py") + # fuzzy logic disabled v0.11.2-dev def __test_replace_most_similar_chunk(self): whole = "This is a sample text.\nAnother line of text.\nYet another line.\n"