Armor AutoCompleter against unicode errors #305

This commit is contained in:
Paul Gauthier 2023-11-03 07:26:21 -07:00
parent efb3f03a62
commit f3d3815201
3 changed files with 42 additions and 1 deletions

View file

@ -44,7 +44,7 @@ class AutoCompleter(Completer):
try: try:
with open(fname, "r", encoding=self.encoding) as f: with open(fname, "r", encoding=self.encoding) as f:
content = f.read() content = f.read()
except FileNotFoundError: except (FileNotFoundError, UnicodeDecodeError):
continue continue
try: try:
lexer = guess_lexer_for_filename(fname, content) lexer = guess_lexer_for_filename(fname, content)

View file

@ -468,3 +468,20 @@ class TestCommands(TestCase):
del coder del coder
del commands del commands
del repo del repo
def test_cmd_add_unicode_error(self):
# Initialize the Commands and InputOutput objects
io = InputOutput(pretty=False, yes=True)
from aider.coders import Coder
coder = Coder.create(models.GPT35, None, io)
commands = Commands(io, coder)
fname = "file.txt"
encoding = "utf-16"
some_content_which_will_error_if_read_with_encoding_utf8 = "ÅÍÎÏ".encode(encoding)
with open(fname, "wb") as f:
f.write(some_content_which_will_error_if_read_with_encoding_utf8)
commands.cmd_add("file.txt")
self.assertEqual(coder.abs_fnames, set())

View file

@ -1,8 +1,10 @@
import os import os
import unittest import unittest
from pathlib import Path
from unittest.mock import patch from unittest.mock import patch
from aider.io import AutoCompleter, InputOutput from aider.io import AutoCompleter, InputOutput
from tests.utils import ChdirTemporaryDirectory
class TestInputOutput(unittest.TestCase): class TestInputOutput(unittest.TestCase):
@ -19,6 +21,28 @@ class TestInputOutput(unittest.TestCase):
autocompleter = AutoCompleter(root, rel_fnames, addable_rel_fnames, commands, "utf-8") autocompleter = AutoCompleter(root, rel_fnames, addable_rel_fnames, commands, "utf-8")
self.assertEqual(autocompleter.words, set(rel_fnames)) self.assertEqual(autocompleter.words, set(rel_fnames))
def test_autocompleter_with_unicode_file(self):
with ChdirTemporaryDirectory():
root = ""
fname = "file.py"
rel_fnames = [fname]
addable_rel_fnames = []
commands = None
autocompleter = AutoCompleter(root, rel_fnames, addable_rel_fnames, commands, "utf-8")
self.assertEqual(autocompleter.words, set(rel_fnames))
Path(fname).write_text("def hello(): pass\n")
autocompleter = AutoCompleter(root, rel_fnames, addable_rel_fnames, commands, "utf-8")
self.assertEqual(autocompleter.words, set(rel_fnames + ["hello"]))
encoding = "utf-16"
some_content_which_will_error_if_read_with_encoding_utf8 = "ÅÍÎÏ".encode(encoding)
with open(fname, "wb") as f:
f.write(some_content_which_will_error_if_read_with_encoding_utf8)
autocompleter = AutoCompleter(root, rel_fnames, addable_rel_fnames, commands, "utf-8")
self.assertEqual(autocompleter.words, set(rel_fnames))
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()