fix: Improve filename detection in find_filename function

This commit is contained in:
Paul Gauthier 2024-08-26 13:52:35 -07:00 committed by Paul Gauthier (aider)
parent a716fda897
commit 66e9c3834a
2 changed files with 10 additions and 12 deletions

View file

@ -532,12 +532,9 @@ def find_filename(lines, fence, valid_fnames):
if not line.startswith(fence[0]): if not line.startswith(fence[0]):
break break
if not len(filenames): if not filenames:
return return
if len(filenames) == 1:
return filenames[0]
# pick the *best* filename found # pick the *best* filename found
# Check for exact match first # Check for exact match first
@ -553,7 +550,7 @@ def find_filename(lines, fence, valid_fnames):
# Perform fuzzy matching with valid_fnames # Perform fuzzy matching with valid_fnames
for fname in filenames: 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: if len(close_matches) == 1:
return close_matches[0] return close_matches[0]
@ -562,7 +559,8 @@ def find_filename(lines, fence, valid_fnames):
if "." in fname: if "." in fname:
return 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): def find_similar_lines(search_lines, content_lines, threshold=0.6):

View file

@ -18,23 +18,19 @@ class TestUtils(unittest.TestCase):
def test_find_filename(self): def test_find_filename(self):
fence = ("```", "```") 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 # Test with filename on a single line
lines = ["file1.py", "```"] lines = ["file1.py", "```"]
self.assertEqual(eb.find_filename(lines, fence, valid_fnames), "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 # Test with filename in fence
lines = ["```python", "file3.py", "```"] lines = ["```python", "file3.py", "```"]
self.assertEqual(eb.find_filename(lines, fence, valid_fnames), "dir/file3.py") self.assertEqual(eb.find_filename(lines, fence, valid_fnames), "dir/file3.py")
# Test with no valid filename # Test with no valid filename
lines = ["```", "invalid_file.py", "```"] 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 # Test with multiple fences
lines = ["```python", "file1.py", "```", "```", "file2.py", "```"] lines = ["```python", "file1.py", "```", "```", "file2.py", "```"]
@ -48,6 +44,10 @@ class TestUtils(unittest.TestCase):
lines = ["file1_py", "```"] lines = ["file1_py", "```"]
self.assertEqual(eb.find_filename(lines, fence, valid_fnames), "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 # fuzzy logic disabled v0.11.2-dev
def __test_replace_most_similar_chunk(self): def __test_replace_most_similar_chunk(self):
whole = "This is a sample text.\nAnother line of text.\nYet another line.\n" whole = "This is a sample text.\nAnother line of text.\nYet another line.\n"