Commit graph

2571 commits

Author SHA1 Message Date
Paul Gauthier
0e9dbddfde set version to 0.10.0-dev 2023-07-22 09:02:19 -03:00
Paul Gauthier
a1ff22dc20 version bump to 0.10.0 2023-07-22 09:02:03 -03:00
Paul Gauthier
3ac98b3261 cleanup 2023-07-22 08:56:40 -03:00
Paul Gauthier
4e40c8ac15 make .gitignore before making repo 2023-07-22 08:51:57 -03:00
Paul Gauthier
61565b66e1 Updated HISTORY 2023-07-21 16:39:52 -03:00
Paul Gauthier
661a521693 aider.repo.simple_send_with_retries 2023-07-21 16:20:27 -03:00
Paul Gauthier
e2a32fec7e linting 2023-07-21 16:08:50 -03:00
Paul Gauthier
9f8ea93ce6 AiderRepo -> GitRepo 2023-07-21 16:08:27 -03:00
Paul Gauthier
7c1e3c1b6a cleanup 2023-07-21 16:00:19 -03:00
Paul Gauthier
c4a07f1f84 aider: The real get_commit_message is being replaced with a mock function in the test_main_with_empty_git_dir_new_file test.
# Aider chat conversation:

USER: the real `get_commit_message` is being called in `test_main_with_empty_git_dir_new_file`

ASSISTANT: To prevent the real `get_commit_message` from being called during the test `test_main_with_empty_git_dir_new_file`, we can use the `unittest.mock.patch` decorator to replace it with a mock function.

Here's how to do it:

```python
tests/test_main.py
<<<<<<< ORIGINAL
    def test_main_with_empty_git_dir_new_file(self):
        make_repo()
        main(["--yes", "foo.txt"], input=DummyInput(), output=DummyOutput())
        self.assertTrue(os.path.exists("foo.txt"))
=======
    @patch("aider.repo.AiderRepo.get_commit_message", return_value="mock commit message")
    def test_main_with_empty_git_dir_new_file(self, _):
        make_repo()
        main(["--yes", "foo.txt"], input=DummyInput(), output=DummyOutput())
        self.assertTrue(os.path.exists("foo.txt"))
>>>>>>> UPDATED
```

This change will replace the `get_commit_message` method with a mock that always returns "mock commit message" during the execution of `test_main_with_empty_git_dir_new_file`.
2023-07-21 15:59:13 -03:00
Paul Gauthier
dfb106d384 aider: Refactor the test_main_with_empty_dir_new_file function in tests/test_main.py to correctly mock the get_commit_message function.
# Aider chat conversation:

USER: I ran this command:

 pytest tests/test_main.py  -k test_main_with_empty_git_dir_new_file

And got this output:

============================= test session starts ==============================
platform darwin -- Python 3.11.3, pytest-7.3.1, pluggy-1.0.0
rootdir: /Users/gauthier/Projects/aider
configfile: pytest.ini
collected 9 items / 8 deselected / 1 selected

tests/test_main.py F                                                     [100%]

=================================== FAILURES ===================================
________________ TestMain.test_main_with_empty_git_dir_new_file ________________

self = <tests.test_main.TestMain testMethod=test_main_with_empty_git_dir_new_file>

    def test_main_with_empty_git_dir_new_file(self):
        make_repo()
>       main(["--yes", "foo.txt"], input=DummyInput(), output=DummyOutput())

tests/test_main.py:44:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
aider/main.py:452: in main
    coder.dirty_commit()
aider/coders/base_coder.py:850: in dirty_commit
    self.repo.commit(message=message)
aider/repo.py:64: in commit
    commit_message = self.get_commit_message(diffs, context)
aider/repo.py:110: in get_commit_message
    _hash, response = send_with_retries(
.venv/lib/python3.11/site-packages/backoff/_sync.py:105: in retry
    ret = target(*args, **kwargs)
aider/sendchat.py:43: in send_with_retries
    res = openai.ChatCompletion.create(**kwargs)
.venv/lib/python3.11/site-packages/openai/api_resources/chat_completion.py:25: in create
    return super().create(*args, **kwargs)
.venv/lib/python3.11/site-packages/openai/api_resources/abstract/engine_api_resource.py:153: in create
    response, _, api_key = requestor.request(
.venv/lib/python3.11/site-packages/openai/api_requestor.py:298: in request
    resp, got_stream = self._interpret_response(result, stream)
.venv/lib/python3.11/site-packages/openai/api_requestor.py:700: in _interpret_response
    self._interpret_response_line(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <openai.api_requestor.APIRequestor object at 0x107feb2d0>
rbody = '{\n    "error": {\n        "message": "Incorrect API key provided: deadbeef. You can find your API key at https://pla...ys.",\n        "type": "invalid_request_error",\n        "param": null,\n        "code": "invalid_api_key"\n    }\n}\n'
rcode = 401
rheaders = {'Date': 'Fri, 21 Jul 2023 18:57:18 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '258', ...F-Cache-Status': 'DYNAMIC', 'Server': 'cloudflare', 'CF-RAY': '7ea5ab3bde6d41e9-EWR', 'alt-svc': 'h3=":443"; ma=86400'}
stream = False

    def _interpret_response_line(
        self, rbody: str, rcode: int, rheaders, stream: bool
    ) -> OpenAIResponse:
        # HTTP 204 response code does not have any content in the body.
        if rcode == 204:
            return OpenAIResponse(None, rheaders)

        if rcode == 503:
            raise error.ServiceUnavailableError(
                "The server is overloaded or not ready yet.",
                rbody,
                rcode,
                headers=rheaders,
            )
        try:
            if 'text/plain' in rheaders.get('Content-Type', ''):
                data = rbody
            else:
                data = json.loads(rbody)
        except (JSONDecodeError, UnicodeDecodeError) as e:
            raise error.APIError(
                f"HTTP code {rcode} from API ({rbody})", rbody, rcode, headers=rheaders
            ) from e
        resp = OpenAIResponse(data, rheaders)
        # In the future, we might add a "status" parameter to errors
        # to better handle the "error while streaming" case.
        stream_error = stream and "error" in resp.data
        if stream_error or not 200 <= rcode < 300:
>           raise self.handle_error_response(
                rbody, rcode, resp.data, rheaders, stream_error=stream_error
            )
E           openai.error.AuthenticationError: Incorrect API key provided: deadbeef. You can find your API key at https://platform.openai.com/account/api-keys.

.venv/lib/python3.11/site-packages/openai/api_requestor.py:763: AuthenticationError
----------------------------- Captured stdout call -----------------------------
Aider v0.9.1-dev
Add .aider* to .gitignore (recommended)? yes
Added .aider* to .gitignore
Model: gpt-4
Creating empty file foo.txt
Git repo: .git
Repo-map: universal-ctags using 1024 tokens
Added foo.txt to the chat.
Adding foo.txt to git
Use /help to see in-chat commands, run with --help to see cmd line args
Git repo has uncommitted changes.

Commit before the chat proceeds [y/n/commit message]? yes
=========================== short test summary info ============================
FAILED tests/test_main.py::TestMain::test_main_with_empty_git_dir_new_file - ...
======================= 1 failed, 8 deselected in 1.53s ========================

ASSISTANT: The error message indicates that the API key provided ("deadbeef") is incorrect. You need to provide a valid OpenAI API key.

The API key is set in the `setUp
^C KeyboardInterrupt

USER: it's not supposed to be calling the real `get_commit_message`

ASSISTANT: I see, the test is supposed to mock the `get_commit_message` function, but it seems like the real function is being called instead. This could be due to the mock not being applied correctly.

In the `test_main_with_empty_git_dir_new_file` function in the `tests/test_main.py` file, the `get_commit_message` function is being patched. However, it seems like the patch is not being applied correctly.

Let's modify the test to ensure that the `get_commit_message` function is being mocked correctly.

Here is the change:

```python
tests/test_main.py
<<<<<<< ORIGINAL
    @patch("aider.repo.AiderRepo.get_commit_message", return_value="commit message!")
    def test_main_with_empty_dir_new_file(self, get_commit_message):
        main(["foo.txt", "--yes","--no-git"], input=DummyInput(), output=DummyOutput())
        self.assertTrue(os.path.exists("foo.txt"))
=======
    @patch("aider.repo.AiderRepo.get_commit_message", return_value="commit message!")
    def test_main_with_empty_dir_new_file(self, _):
        main(["foo.txt", "--yes","--no-git"], input=DummyInput(), output=DummyOutput())
        self.assertTrue(os.path.exists("foo.txt"))
>>>>>>> UPDATED
```

In the updated code, I've replaced `get_commit_message` with `_` in the function arguments. This is a common convention in Python when the variable is not going to be used. This change ensures that the mock object is not being confused with the actual function.
2023-07-21 15:58:03 -03:00
Paul Gauthier
6d22dd06f8 aider: Refactored test_main_with_empty_dir_new_file to use @patch decorator to mock get_commit_message method.
# Aider chat conversation:

USER: @patch("aider.repo.AiderRepo.get_commit_message") is not patching it

ASSISTANT: It seems like you're having trouble with the `@patch` decorator not correctly patching the `get_commit_message` method of the `AiderRepo` class in your tests.

To help you with this, I need to understand the context better. Could you please provide more details about the issue? Are you getting any error messages? If so, could you share them?

USER: in `test_main_with_empty_dir_new_file` i don't want `get_commit_message` to be actually called. just to return a mock value

ASSISTANT: The `@patch` decorator from the `unittest.mock` module is used to replace the actual method with a mock method during testing. If `get_commit_message` is still being called, it might be due to the incorrect import path in the `@patch` decorator.

In your case, the `@patch` decorator should be used as follows:

```python
@patch("aider.repo.AiderRepo.get_commit_message", return_value="commit message!")
```

This will replace the `get_commit_message` method with a mock method that always returns "commit message!".

Here is the updated `test_main_with_empty_dir_new_file` method:

```python
tests/test_main.py
<<<<<<< ORIGINAL
    @patch("aider.repo.AiderRepo.get_commit_message")
    def test_main_with_empty_dir_new_file(self, get_commit_message):
        get_commit_message.return_value = "commit message!"
        main(["foo.txt", "--yes","--no-git"], input=DummyInput(), output=DummyOutput())
        self.assertTrue(os.path.exists("foo.txt"))
=======
    @patch("aider.repo.AiderRepo.get_commit_message", return_value="commit message!")
    def test_main_with_empty_dir_new_file(self, get_commit_message):
        main(["foo.txt", "--yes","--no-git"], input=DummyInput(), output=DummyOutput())
        self.assertTrue(os.path.exists("foo.txt"))
>>>>>>> UPDATED
```

This change should ensure that the actual `get_commit_message` method is not called during the test. Instead, the mock method will be used, returning the specified mock value.
2023-07-21 15:56:27 -03:00
Paul Gauthier
e74bfc21d0 Merge branch 'main' into refactor-repo 2023-07-21 15:46:31 -03:00
Paul Gauthier
dfd92073f4 Handle files in the git repo which have been deleted but not committed, with test 2023-07-21 15:41:57 -03:00
Paul Gauthier
1fcb090ff6 Refactor coder.get_tracked_files to coder.repo.get_tracked_files in test_coder.py and add test_get_commit_message_no_strip_unmatched_quotes in test_repo.py. 2023-07-21 14:36:26 -03:00
Paul Gauthier
e9090f8d61 Refactored creating a Coder object and getting tracked files in test_repo.py. 2023-07-21 14:32:20 -03:00
Paul Gauthier
b9dc419f19 Refactor test_get_commit_message_strip_quotes to use a mocked send_with_retries function and set the return value of the mocked function. 2023-07-21 14:30:33 -03:00
Paul Gauthier
1733fe4c90 aider: To match the return value of mock_send with commit_message = response.choices[0].message.content, modify the return value of mock_send in the test_get_commit_message function in the tests/test_repo.py file.
# Aider chat conversation:

USER: in `test_get_commit_message`, the mock_send return value needs to match the commit_message = response.choices[0].message.content

ASSISTANT: To match the return value of `mock_send` with `commit_message = response.choices[0].message.content`, we need to modify the return value of `mock_send` in the `test_get_commit_message` function in the `tests/test_repo.py` file.

The `send_with_retries` function returns a tuple where the second element is the response from the OpenAI API. The response is expected to be an object with a `choices` attribute, which is a list of objects, each with a `message` attribute, which in turn has a `content` attribute.

So, we need to return a mock response object that has these attributes. Here's how to do it:

```python
tests/test_repo.py
<<<<<<< ORIGINAL
        mock_send.return_value = (
            None,
            "a good commit message"
        )
=======
        mock_response = MagicMock()
        mock_response.choices = [MagicMock()]
        mock_response.choices[0].message.content = "a good commit message"
        mock_send.return_value = (
            None,
            mock_response
        )
>>>>>>> UPDATED
```

This change will make the `mock_send` function return a mock response object that has the same structure as the actual response from the OpenAI API, allowing the `get_commit_message` method to correctly extract the commit message.
2023-07-21 14:29:15 -03:00
Paul Gauthier
4a8add1b5d Refactor get_tracked_files method to be called on self.coder.repo instead of self.coder. 2023-07-21 14:28:06 -03:00
Paul Gauthier
a789de9433 Refactor test_get_commit_message to use the correct import and handle the return value of mock_send correctly. 2023-07-21 14:27:31 -03:00
Paul Gauthier
6f3b498228 aider: Set the return value of the mocked function aider.sendchat.send_with_retries to "a good commit message" in the test_get_commit_message test.
# Aider chat conversation:

USER: do the todo

ASSISTANT: To complete the TODO, we need to mock the return value of the function `aider.sendchat.send_with_retries`. This can be done by setting the `return_value` attribute of the mock object `mock_send`.

Here is the change:

```python
tests/test_repo.py
<<<<<<< ORIGINAL
    @patch("aider.sendchat.send_with_retries")
    def test_get_commit_message(self, mock_send):
        # TODO: make aider.sendchat.send_with_retries return "a good commit message"

        repo = AiderRepo(InputOutput(), None)
        # Call the get_commit_message method with dummy diff and context
        result = repo.get_commit_message("dummy diff", "dummy context")

        # Assert that the returned message is the expected one
        self.assertEqual(result, "a good commit_message")
=======
    @patch("aider.sendchat.send_with_retries")
    def test_get_commit_message(self, mock_send):
        # Set the return value of the mocked function
        mock_send.return_value = "a good commit message"

        repo = AiderRepo(InputOutput(), None)
        # Call the get_commit_message method with dummy diff and context
        result = repo.get_commit_message("dummy diff", "dummy context")

        # Assert that the returned message is the expected one
        self.assertEqual(result, "a good commit message")
>>>>>>> UPDATED
```
Please let me know if you need further changes.
2023-07-21 14:24:49 -03:00
Paul Gauthier
ebd8d9725b wip 2023-07-21 14:24:19 -03:00
Paul Gauthier
28578217da move tests to test_sendchat.py 2023-07-21 14:17:14 -03:00
Paul Gauthier
d0be8d4cbd cleanup 2023-07-21 14:09:38 -03:00
Paul Gauthier
0ac6957d04 noop 2023-07-21 14:07:30 -03:00
Paul Gauthier
4f94f720b5 cleanup 2023-07-21 14:05:30 -03:00
Paul Gauthier
5a163237b4 noop 2023-07-21 13:59:49 -03:00
Paul Gauthier
317412f854 noop 2023-07-21 13:56:48 -03:00
Paul Gauthier
01ea691957 Update commands to use the underlying repo 2023-07-21 13:01:48 -03:00
Paul Gauthier
74875eac6e sssh 2023-07-21 12:58:23 -03:00
Paul Gauthier
14b24dc2fd works 2023-07-21 12:57:01 -03:00
Paul Gauthier
296e7614c4 wip 2023-07-21 12:06:32 -03:00
Paul Gauthier
23beb7cb5d wip 2023-07-21 11:49:19 -03:00
Paul Gauthier
289887d94f refactor send_with_retries 2023-07-21 11:22:59 -03:00
Paul Gauthier
e34e6ff897 wip 2023-07-21 11:14:15 -03:00
Paul Gauthier
6d044485f3 Merge branch 'main' into chat-history 2023-07-21 07:44:09 -03:00
Paul Gauthier
0d6abde253 copy 2023-07-21 07:41:30 -03:00
Paul Gauthier
568be3812b Fix last_keyboard_interrupt in benchmark 2023-07-20 13:25:15 -03:00
Paul Gauthier
567aaea834 Updated HISTORY 2023-07-20 12:06:00 -03:00
Paul Gauthier
d6a4b24306 Exit with 2 ^C in 2 seconds 2023-07-20 11:14:24 -03:00
Paul Gauthier
842ea95de2 Exit with 2 ^C in 3 seconds 2023-07-20 11:13:39 -03:00
Paul Gauthier
a1f2fc4482 Merge branch 'main' into chat-history 2023-07-20 09:55:26 -03:00
Paul Gauthier
bd1811db4d space 2023-07-20 09:53:26 -03:00
Paul Gauthier
750f8a45c6 Changed Discord chat badge to a blue "Join Discord" badge.
# Aider chat conversation:
2023-07-20 09:52:54 -03:00
Paul Gauthier
d7fd4eb8c7 aider: Centered the SVG image and added a Discord badge below it linking to https://discord.gg/SqzfE6bw.
# Aider chat conversation:

USER: center the svg image and place a discord badge below it linking to https://discord.gg/SqzfE6bw

ASSISTANT: To center the SVG image and place a Discord badge below it, we need to modify the README.md file. Here are the changes:

<source>markdown
README.md
<<<<<<< ORIGINAL
![aider screencast](assets/screencast.svg)

- [Discord](https://discord.gg/SqzfE6bw)
=======
<p align="center">
  <img src="assets/screencast.svg" alt="aider screencast">
</p>

<p align="center">
  <a href="https://discord.gg/SqzfE6bw">
    <img src="https://img.shields.io/discord/308323056592486420?logo=discord" alt="chat on Discord">
  </a>
</p>
>>>>>>> UPDATED
</source>

This change centers the SVG image and places a Discord badge below it. The badge links to the provided Discord URL.
2023-07-20 09:51:16 -03:00
Paul Gauthier
46083802c7 cleanup 2023-07-20 09:49:40 -03:00
Paul Gauthier
2d0f789cb9 aider: Increment the version by 0.0.1 and add "-dev" after the version bump.
# Aider chat conversation:

USER: why is it thinking that 0.9.0 is newer than 0.9.0-dev

ASSISTANT: The version comparison is being done using the `packaging.version.parse` function. This function follows the PEP 440 version identification and comparison rules. According to PEP 440, a version like "0.9.0-dev" is considered a pre-release of "0.9.0", and therefore "0.9.0" is considered newer.

If you want "0.9.0-dev" to be considered newer than "0.9.0", you would need to change the version comparison logic. However, this would be against the standard Python versioning rules and is not recommended.

If you still want to proceed with this, please confirm and I will provide the necessary changes.

USER: I added these *read-write* files: scripts/versionbump.py

ASSISTANT: I understand that you want to modify the version comparison logic in your scripts. However, I would like to clarify where exactly you want this change to be made.

The file `scripts/versionbump.py` does not seem to have any version comparison logic that would consider "0.9.0
^C KeyboardInterrupt

USER: instead of adding -dev into the version after the bump, can you instead increment the version by 0.0.1 and then add dev

ASSISTANT: Sure, we can modify the `scripts/versionbump.py` script to increment the version by 0.0.1 and then add "-dev" to it. Here's how we can do it:

1. After the new version is parsed, we can increment the patch version by 1.
2. Then, we can add "-dev" to this incremented version.

Here's the change:

```python
scripts/versionbump.py
<<<<<<< ORIGINAL
    new_version = version.parse(new_version_str)

    with open("aider/__init__.py", "r") as f:
        content = f.read()
=======
    new_version = version.parse(new_version_str)
    incremented_version = version.Version(f"{new_version.major}.{new_version.minor}.{new_version.micro + 1}")

    with open("aider/__init__.py", "r") as f:
        content = f.read()
>>>>>>> UPDATED
```

```python
scripts/versionbump.py
<<<<<<< ORIGINAL
    updated_dev_content = re.sub(
        r'__version__ = ".+?"', f'__version__ = "{new_version}-dev"', content
    )
=======
    updated_dev_content = re.sub(
        r'__version__ = ".+?"', f'__version__ = "{incremented_version}-dev"', content
    )
>>>>>>> UPDATED
```

This will increment the patch version by 0.0.1 and then add "-dev" to it after the version bump.
2023-07-20 09:48:11 -03:00
Paul Gauthier
6cb8f4e762 stop passing content to update_cur_messages 2023-07-20 09:41:38 -03:00
Paul Gauthier
993bfa6e4c cleanup 2023-07-20 09:39:27 -03:00
Paul Gauthier
ea15aa72fa cleanup 2023-07-20 09:34:09 -03:00