mirror of
https://github.com/Aider-AI/aider.git
synced 2025-06-01 18:25:00 +00:00
Merge branch 'main' into gitignore
This commit is contained in:
commit
67554196f3
6 changed files with 81 additions and 46 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
__version__ = "0.8.3-dev"
|
__version__ = "0.9.0-dev"
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
46
tests/utils.py
Normal 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
|
Loading…
Add table
Add a link
Reference in a new issue