Merge branch 'main' into gitignore

This commit is contained in:
Paul Gauthier 2023-07-16 12:21:16 -03:00
commit 67554196f3
6 changed files with 81 additions and 46 deletions

View file

@ -1,12 +1,13 @@
# Release history # Release history
### Next release ### v0.9.0
- Support for the OpenAI models in [Azure](https://aider.chat/docs/faq.html#azure) - Support for the OpenAI models in [Azure](https://aider.chat/docs/faq.html#azure)
- Added `--show-repo-map` - Added `--show-repo-map`
- Improved output when retrying connections to the OpenAI API - Improved output when retrying connections to the OpenAI API
- Redacted api key from `--verbose` output - Redacted api key from `--verbose` output
- Bugfix: recognize and add files in subdirectories mentioned by user or GPT - Bugfix: recognize and add files in subdirectories mentioned by user or GPT
- [Benchmarked](https://aider.chat/docs/benchmarks.html) at 53.8% for gpt-3.5-turbo/whole
### v0.8.3 ### v0.8.3

View file

@ -1 +1 @@
__version__ = "0.8.3-dev" __version__ = "0.9.0-dev"

View file

@ -78,6 +78,9 @@ This minimizes your use of the context window, as well as costs.
## Aider isn't editing my files? ## Aider isn't editing my files?
Sometimes GPT will reply with some code changes that don't get applied to your local files.
In these cases, aider might say something like "Failed to apply edit to *filename*".
This usually happens because GPT is not specifying the edits This usually happens because GPT is not specifying the edits
to make in the format that aider expects. to make in the format that aider expects.
GPT-3.5 is especially prone to disobeying the system prompt instructions in this manner, but it also happens with GPT-4. GPT-3.5 is especially prone to disobeying the system prompt instructions in this manner, but it also happens with GPT-4.

View file

@ -12,6 +12,7 @@ from aider import models
from aider.coders import Coder from aider.coders import Coder
from aider.dump import dump # noqa: F401 from aider.dump import dump # noqa: F401
from aider.io import InputOutput from aider.io import InputOutput
from tests.utils import GitTemporaryDirectory
class TestCoder(unittest.TestCase): class TestCoder(unittest.TestCase):
@ -95,47 +96,44 @@ class TestCoder(unittest.TestCase):
self.assertEqual(coder.abs_fnames, expected_files) self.assertEqual(coder.abs_fnames, expected_files)
def test_check_for_ambiguous_filename_mentions_of_longer_paths(self): def test_check_for_ambiguous_filename_mentions_of_longer_paths(self):
# Mock the IO object with GitTemporaryDirectory():
mock_io = MagicMock() io = InputOutput(pretty=False, yes=True)
coder = Coder.create(models.GPT4, None, io)
# Initialize the Coder object with the mocked IO and mocked repo fname = Path("file1.txt")
coder = Coder.create(models.GPT4, None, mock_io) fname.touch()
fname = Path("file1.txt") other_fname = Path("other") / "file1.txt"
fname.touch() other_fname.parent.mkdir(parents=True, exist_ok=True)
other_fname.touch()
other_fname = Path("other") / "file1.txt" mock = MagicMock()
other_fname.parent.mkdir(parents=True, exist_ok=True) mock.return_value = set([str(fname), str(other_fname)])
other_fname.touch() coder.get_tracked_files = mock
mock = MagicMock() # Call the check_for_file_mentions method
mock.return_value = set([str(fname), str(other_fname)]) coder.check_for_file_mentions(f"Please check {fname}!")
coder.get_tracked_files = mock
# Call the check_for_file_mentions method self.assertEqual(coder.abs_fnames, set([str(fname.resolve())]))
coder.check_for_file_mentions(f"Please check {fname}!")
self.assertEqual(coder.abs_fnames, set([str(fname.resolve())]))
def test_check_for_subdir_mention(self): def test_check_for_subdir_mention(self):
# Mock the IO object with GitTemporaryDirectory():
mock_io = MagicMock() io = InputOutput(pretty=False, yes=True)
coder = Coder.create(models.GPT4, None, io)
# Initialize the Coder object with the mocked IO and mocked repo fname = Path("other") / "file1.txt"
coder = Coder.create(models.GPT4, None, mock_io) fname.parent.mkdir(parents=True, exist_ok=True)
fname.touch()
fname = Path("other") / "file1.txt" mock = MagicMock()
fname.parent.mkdir(parents=True, exist_ok=True) mock.return_value = set([str(fname)])
fname.touch() coder.get_tracked_files = mock
mock = MagicMock() dump(fname)
mock.return_value = set([str(fname)]) # Call the check_for_file_mentions method
coder.get_tracked_files = mock coder.check_for_file_mentions(f"Please check `{fname}`")
# Call the check_for_file_mentions method self.assertEqual(coder.abs_fnames, set([str(fname.resolve())]))
coder.check_for_file_mentions(f"Please check `{fname}`")
self.assertEqual(coder.abs_fnames, set([str(fname.resolve())]))
def test_get_commit_message(self): def test_get_commit_message(self):
# Mock the IO object # Mock the IO object

View file

@ -1,24 +1,11 @@
import os import os
import tempfile
import unittest import unittest
from unittest.mock import patch from unittest.mock import patch
from aider.io import InputOutput from aider.io import InputOutput
from aider.repomap import RepoMap from aider.repomap import RepoMap
from tests.utils import IgnorantTemporaryDirectory
class IgnorantTemporaryDirectory:
def __init__(self):
self.temp_dir = tempfile.TemporaryDirectory()
def __enter__(self):
return self.temp_dir.__enter__()
def __exit__(self, exc_type, exc_val, exc_tb):
try:
self.temp_dir.__exit__(exc_type, exc_val, exc_tb)
except OSError:
pass # Ignore errors (Windows)
class TestRepoMap(unittest.TestCase): class TestRepoMap(unittest.TestCase):

46
tests/utils.py Normal file
View file

@ -0,0 +1,46 @@
import os
import tempfile
import git
from aider.dump import dump # noqa: F401
class IgnorantTemporaryDirectory:
def __init__(self):
self.temp_dir = tempfile.TemporaryDirectory()
def __enter__(self):
return self.temp_dir.__enter__()
def __exit__(self, exc_type, exc_val, exc_tb):
try:
self.temp_dir.__exit__(exc_type, exc_val, exc_tb)
except OSError:
pass # Ignore errors (Windows)
class ChdirTemporaryDirectory(IgnorantTemporaryDirectory):
def __init__(self):
self.cwd = os.getcwd()
super().__init__()
def __enter__(self):
res = super().__enter__()
os.chdir(self.temp_dir.name)
return res
def __exit__(self, exc_type, exc_val, exc_tb):
os.chdir(self.cwd)
super().__exit__(exc_type, exc_val, exc_tb)
class GitTemporaryDirectory(ChdirTemporaryDirectory):
def __enter__(self):
res = super().__enter__()
repo = git.Repo.init()
repo.config_writer().set_value("user", "name", "Test User").release()
repo.config_writer().set_value("user", "email", "testuser@example.com").release()
return res