Commit graph

963 commits

Author SHA1 Message Date
Paul Gauthier
fe1d0b0e09 copy 2023-05-21 14:17:27 -07:00
Paul Gauthier
3f1eaf566c copy 2023-05-21 14:16:13 -07:00
Paul Gauthier
e047976ce4 copy 2023-05-21 14:15:44 -07:00
Paul Gauthier
8b28539b4e copy 2023-05-21 14:14:30 -07:00
Paul Gauthier
897e19372e copy 2023-05-21 14:12:42 -07:00
Paul Gauthier
7c8bc9453c copy 2023-05-21 14:10:32 -07:00
Paul Gauthier
cfab008989 copy 2023-05-21 12:55:54 -07:00
Paul Gauthier
ab4b379db3 copy 2023-05-21 12:51:05 -07:00
Paul Gauthier
5db6346a39 added ctags doc 2023-05-21 12:50:31 -07:00
Paul Gauthier
4f2e1d14ef sort the file list in the prompt 2023-05-20 07:28:23 -07:00
Paul Gauthier
ffe3da4df1 do not sent file lists longer than 100 files 2023-05-19 16:17:40 -07:00
paul-gauthier
7d08c346bb
Merge pull request #4 from mobyvb/prompt-compression
aider/prompts.py: reduce token size of prompts
2023-05-19 16:10:26 -07:00
Paul Gauthier
c441906a22 aider: Made -v a short option for --verbose.
# Context:
USER: make -v short for --verbose
ASSISTANT: To make `-v` a short option for `--verbose`, you can modify the `aider/main.py` file. Here's the change:

```python
aider/main.py
<<<<<<< ORIGINAL
    parser.add_argument(
        "--verbose",
        action="store_true",
        help="Enable verbose output",
        default=False,
    )
=======
    parser.add_argument(
        "-v", "--verbose",
        action="store_true",
        help="Enable verbose output",
        default=False,
    )
>>>>>>> UPDATED
```
2023-05-19 10:57:59 -07:00
Paul Gauthier
7e6ea0660d Refactor show_messages function to accept an optional title parameter and remove unused code. 2023-05-19 10:57:24 -07:00
Paul Gauthier
10e38e1fe9 aider: Added --verbose option to enable verbose output.
# Context:
USER: Add --verbose with no env default. pass into Coder and set self.verbose
ASSISTANT: To add the `--verbose` option, we need to modify the `aider/main.py` file. Here's the step-by-step process:

1. Add the `--verbose` argument to the `argparse.ArgumentParser` in the `main` function.
2. Pass the `args.verbose` value to the `Coder` class when initializing it.
3. Update the `Coder` class in the `aider/coder.py` file to accept the `verbose` parameter and set `self.verbose`.

Here are the changes to the code:

```python
aider/main.py
<<<<<<< ORIGINAL
    parser.add_argument(
        "--yes",
        action="store_true",
        help="Always say yes to every confirmation",
        default=False,
    )
=======
    parser.add_argument(
        "--yes",
        action="store_true",
        help="Always say yes to every confirmation",
        default=False,
    )
    parser.add_argument(
        "--verbose",
        action="store_true",
        help="Enable verbose output",
        default=False,
    )
>>>>>>> UPDATED
```

```python
aider/main.py
<<<<<<< ORIGINAL
    coder = Coder(
        io,
        main_model=args.model,
        fnames=args.files,
        pretty=args.pretty,
        show_diffs=args.show_diffs,
        auto_commits=args.auto_commits,
        dry_run=args.dry_run,
        use_ctags=args.ctags,
    )
=======
    coder = Coder(
        io,
        main_model=args.model,
        fnames=args.files,
        pretty=args.pretty,
        show_diffs=args.show_diffs,
        auto_commits=args.auto_commits,
        dry_run=args.dry_run,
        use_ctags=args.ctags,
        verbose=args.verbose,
    )
>>>>>>> UPDATED
```

```python
aider/coder.py
<<<<<<< ORIGINAL
    def __init__(
        self,
        io,
        main_model="gpt-4",
        fnames=None,
        pretty=True,
        show_diffs=False,
        auto_commits=True,
        dry_run=False,
        use_ctags=False,
    ):
=======
    def __init__(
        self,
        io,
        main_model="gpt-4",
        fnames=None,
        pretty=True,
        show_diffs=False,
        auto_commits=True,
        dry_run=False,
        use_ctags=False,
        verbose=False,
    ):
        self.verbose = verbose
>>>>>>> UPDATED
```
2023-05-19 10:55:48 -07:00
Paul Gauthier
7d2c59432e copy 2023-05-19 10:52:23 -07:00
Paul Gauthier
a7d9a4790f aider: Added --ctags option to the usage section in README.md.
# Context:
USER: update the usage to include --ctags
ASSISTANT: ```markdown
README.md
<<<<<<< ORIGINAL
You can also use additional command-line options to customize the behavior of the tool. The following options are available, along with their corresponding environment variable overrides:

- `--input-history-file INPUT_HISTORY_FILE`: Specify the chat input history file (default: .aider.input.history). Override the default with the environment variable `AIDER_INPUT_HISTORY_FILE`.
- `--chat-history-file CHAT_HISTORY_FILE`: Specify the chat history file (default: .aider.chat.history.md). Override the default with the environment variable `AIDER_CHAT_HISTORY_FILE`.
- `--model MODEL`: Specify the model to use for the main chat (default: gpt-4). Override the default with the environment variable `AIDER_MODEL`.
- `-3`: Use gpt-3.5-turbo model for the main chat (not advised). No environment variable override.
=======
You can also use additional command-line options to customize the behavior of the tool. The following options are available, along with their corresponding environment variable overrides:

- `--input-history-file INPUT_HISTORY_FILE`: Specify the chat input history file (default: .aider.input.history). Override the default with the environment variable `AIDER_INPUT_HISTORY_FILE`.
- `--chat-history-file CHAT_HISTORY_FILE`: Specify the chat history file (default: .aider.chat.history.md). Override the default with the environment variable `AIDER_CHAT_HISTORY_FILE`.
- `--model MODEL`: Specify the model to use for the main chat (default: gpt-4). Override the default with the environment variable `AIDER_MODEL`.
- `-3`: Use gpt-3.5-turbo model for the main chat (not advised). No environment variable override.
- `--ctags`: Add ctags to the chat to help GPT understand the codebase (default: False, `AIDER_CTAGS`). Override the default with the environment variable `AIDER_CTAGS`.
>>>>>>> UPDATED
```
I've updated the usage section in the README.md to include the `--ctags` option.
2023-05-19 10:50:53 -07:00
Paul Gauthier
b82bb65b86 help msg for --ctags 2023-05-19 10:49:11 -07:00
Paul Gauthier
32e40a3e1c aider: Prevent gpt-3.5-turbo from generating commit messages for diffs larger than 4k tokens and catch InvalidRequestError.
# Context:
USER: `Coder.get_commit_message()` uses gpt-3.5-turbo to summarize the diffs into a sensible commit message. If the diff is large, it exceeds the 4K context window.

A simple fix would be:

1. Check if the diff is close to or larger than 4 kbytes (4k tokens * 4 bytes/token) and don't even bother sending the messages to gpt. Just return.
2. Catch the `openai.error.InvalidRequestError` and just return.

Maybe print a nice tool_error() message for each of these.

ASSISTANT: To implement the suggested changes, we will modify the `get_commit_message()` method in the `aider/coder.py` file. Here are the step-by-step changes:

1. Check if the length of `diffs` is close to or larger than 4 kbytes (4k tokens * 4 bytes/token). If it is, print an error message and return.
2. Catch the `openai.error.InvalidRequestError` exception when calling `self.send()` and print an error message, then return.

Here are the code changes:

```python
aider/coder.py
<<<<<<< ORIGINAL
    def get_commit_message(self, diffs, context):
        diffs = "# Diffs:\n" + diffs

        messages = [
            dict(role="system", content=prompts.commit_system),
            dict(role="user", content=context + diffs),
        ]

        commit_message, interrupted = self.send(
            messages,
            model="gpt-3.5-turbo",
            silent=True,
        )
=======
    def get_commit_message(self, diffs, context):
        if len(diffs) >= 4 * 1024 * 4:
            self.io.tool_error("Diff is too large for gpt-3.5-turbo to generate a commit message.")
            return

        diffs = "# Diffs:\n" + diffs

        messages = [
            dict(role="system", content=prompts.commit_system),
            dict(role="user", content=context + diffs),
        ]

        try:
            commit_message, interrupted = self.send(
                messages,
                model="gpt-3.5-turbo",
                silent=True,
            )
        except openai.error.InvalidRequestError:
            self.io.tool_error("Failed to generate commit message using gpt-3.5-turbo due to an invalid request.")
            return
>>>>>>> UPDATED
```
2023-05-19 10:41:43 -07:00
Paul Gauthier
af85c81c13 fixed missing case of just the filename 2023-05-19 10:32:55 -07:00
Paul Gauthier
046e6ed9d4 aider: Added in-memory cache to get_tags function using a tuple (filename, root_dname) as the cache key.
# Context:
USER: add an in memory cache to get_tags that only updates if the st_mtime of the filename changes
ASSISTANT: To implement an in-memory cache for the `get_tags` function, we will need to modify the `aider/ctags.py` file. We will use a dictionary to store the cache and check the file's modification time to decide whether to update the cache or not.

Here are the steps to implement the cache:

1. Create a global variable `TAGS_CACHE` to store the cache.
2. In the `get_tags` function, check if the filename is in the cache and if the modification time has not changed.
3. If the conditions in step 2 are met, return the cached value.
4. If the conditions in step 2 are not met, update the cache with the new tags and return them.

Here are the changes to the `aider/ctags.py` file:

```python
aider/ctags.py
<<<<<<< ORIGINAL
import os
import json
import sys
import subprocess

# from aider.dump import dump
=======
import os
import json
import sys
import subprocess

# Global cache for tags
TAGS_CACHE = {}

# from aider.dump import dump
>>>>>>> UPDATED
```

```python
aider/ctags.py
<<<<<<< ORIGINAL
def get_tags(filename, root_dname):
    cmd = ["ctags", "--fields=+S", "--output-format=json", filename]
    output = subprocess.check_output(cmd).decode("utf-8")
    output = output.splitlines()
=======
def get_tags(filename, root_dname):
    # Check if the file is in the cache and if the modification time has not changed
    file_mtime = os.path.getmtime(filename)
    if filename in TAGS_CACHE and TAGS_CACHE[filename]["mtime"] == file_mtime:
        return TAGS_CACHE[filename]["tags"]

    cmd = ["ctags", "--fields=+S", "--output-format=json", filename]
    output = subprocess.check_output(cmd).decode("utf-8")
    output = output.splitlines()
>>>>>>> UPDATED
```

```python
aider/ctags.py
<<<<<<< ORIGINAL
    for line in output:
        tag = json.loads(line)
        path = tag.get("path")
        scope = tag.get("scope")
        kind = tag.get("kind")
        name = tag.get("name")
        signature = tag.get("signature")

        last = name
        if signature:
            last += " " + signature

        res = split_path(path, root_dname)
        if scope:
            res.append(scope)
        res += [kind, last]

        yield res
=======
    tags = []
    for line in output:
        tag = json.loads(line)
        path = tag.get("path")
        scope = tag.get("scope")
        kind = tag.get("kind")
        name = tag.get("name")
        signature = tag.get("signature")

        last = name
        if signature:
            last += " " + signature

        res = split_path(path, root_dname)
        if scope:
            res.append(scope)
        res += [kind, last]
        tags.append(res)

    #
^C KeyboardInterrupt
USER: sorry, please do that again. but set key=(filename, root_dname) and use that as the cache key
ASSISTANT: No problem. I will modify the cache implementation to use a tuple (filename, root_dname) as the cache key. Here are the updated changes to the `aider/ctags.py` file:

```python
aider/ctags.py
<<<<<<< ORIGINAL
import os
import json
import sys
import subprocess

# from aider.dump import dump
=======
import os
import json
import sys
import subprocess

# Global cache for tags
TAGS_CACHE = {}

# from aider.dump import dump
>>>>>>> UPDATED
```

```python
aider/ctags.py
<<<<<<< ORIGINAL
def get_tags(filename, root_dname):
    cmd = ["ctags", "--fields=+S", "--output-format=json", filename]
    output = subprocess.check_output(cmd).decode("utf-8")
    output = output.splitlines()
=======
def get_tags(filename, root_dname):
    # Check if the file is in the cache and if the modification time has not changed
    file_mtime = os.path.getmtime(filename)
    cache_key = (filename, root_dname)
    if cache_key in TAGS_CACHE and TAGS_CACHE[cache_key]["mtime"] == file_mtime:
        return TAGS_CACHE[cache_key]["tags"]

    cmd = ["ctags", "--fields=+S", "--output-format=json", filename]
    output = subprocess.check_output(cmd).decode("utf-8")
    output = output.splitlines()
>>>>>>> UPDATED
```

```python
aider/ctags.py
<<<<<<< ORIGINAL
    for line in output:
        tag = json.loads(line)
        path = tag.get("path")
        scope = tag.get("scope")
        kind = tag.get("kind")
        name = tag.get("name")
        signature = tag.get("signature")

        last = name
        if signature:
            last += " " + signature

        res = split_path(path, root_dname)
        if scope:
            res.append(scope)
        res += [kind, last]

        yield res
=======
    tags = []
    for line in output:
        tag = json.loads(line)
        path = tag.get("path")
        scope = tag.get("scope")
        kind = tag.get("kind")
        name = tag.get("name")
        signature = tag.get("signature")

        last = name
        if signature:
            last += " " + signature

        res = split_path(path, root_dname)
        if scope:
            res.append(scope)
        res += [kind, last]
        tags.append(res)

    # Update the cache
    TAGS_CACHE[cache_key] = {"mtime": file_mtime, "tags": tags}

    return tags
>>>>>>> UPDATED
```
2023-05-19 10:32:02 -07:00
Paul Gauthier
9a243d7adc sssh 2023-05-19 10:19:23 -07:00
Paul Gauthier
1391e9de9b aider: Updated cmd_run method in aider/commands.py to use the io version of Confirm.ask().
# Context:
USER: in commands, switch the Confirm.ask() calls to use the io versions
ASSISTANT: I will update the `cmd_add` method in the `aider/commands.py` file to use the `io` versions of `Confirm.ask()`.

^C KeyboardInterrupt
USER: switch the Confirm.ask() calls to use the io versions
ASSISTANT: I will update the `cmd_add` method in the `aider/commands.py` file to use the `io` versions of `Confirm.ask()`.

```python
aider/commands.py
<<<<<<< ORIGINAL
                if self.coder.repo is not None:
                    create_file = self.io.confirm_ask(
                        (
                            f"No files matched
^C KeyboardInterrupt
USER: no, they already do. cmd_run
ASSISTANT: I apologize for the confusion. I will update the `cmd_run` method in the `aider/commands.py` file to use the `io` version of `Confirm.ask()`.

```python
aider/commands.py
<<<<<<< ORIGINAL
        ok = Confirm.ask("Add the output to the chat?", default="y")
=======
        ok = self.io.confirm_ask("Add the output to the chat?", default="y")
>>>>>>> UPDATED
```
2023-05-19 10:18:49 -07:00
Paul Gauthier
71f6d09c78 cleanup 2023-05-19 10:16:49 -07:00
Paul Gauthier
fd66aac159 cleanup 2023-05-19 10:12:56 -07:00
Paul Gauthier
f6aaa19299 implement --ctags 2023-05-19 10:07:52 -07:00
Paul Gauthier
68c58ea394 aider: Added --ctags argument and environment variable to pass to Coder class.
# Context:
USER: add a --ctags arg and env var. pass it to Coder to set self.use_ctags
ASSISTANT: To add a `--ctags` argument and environment variable, and pass it to the `Coder` class, follow these steps:

1. Modify `aider/main.py` to add the `--ctags` argument and read the environment variable.
2. Modify the `Coder` class in `aider/coder.py` to accept the `use_ctags` parameter and set it as an instance variable.

Here are the necessary code changes:

```python
aider/main.py
<<<<<<< ORIGINAL
    parser.add_argument(
        "--show-diffs",
        action="store_true",
        help=f"Show diffs when committing changes (default: False, ${env_prefix}SHOW_DIFFS)",
        default=bool(int(os.environ.get(f"{env_prefix}SHOW_DIFFS", 0))),
    )
=======
    parser.add_argument(
        "--show-diffs",
        action="store_true",
        help=f"Show diffs when committing changes (default: False, ${env_prefix}SHOW_DIFFS)",
        default=bool(int(os.environ.get(f"{env_prefix}SHOW_DIFFS", 0))),
    )
    parser.add_argument(
        "--ctags",
        action="store_true",
        help=f"Use ctags for file listing (default: False, ${env_prefix}CTAGS)",
        default=bool(int(os.environ.get(f"{env_prefix}CTAGS", 0))),
    )
>>>>>>> UPDATED
```

```python
aider/main.py
<<<<<<< ORIGINAL
    coder = Coder(
        io,
        main_model=args.model,
        fnames=args.files,
        pretty=args.pretty,
        show_diffs=args.show_diffs,
        auto_commits=args.auto_commits,
        dry_run=args.dry_run,
    )
=======
    coder = Coder(
        io,
        main_model=args.model,
        fnames=args.files,
        pretty=args.pretty,
        show_diffs=args.show_diffs,
        auto_commits=args.auto_commits,
        dry_run=args.dry_run,
        use_ctags=args.ctags,
    )
>>>>>>> UPDATED
```

```python
aider/coder.py
<<<<<<< ORIGINAL
    def __init__(
        self,
        io,
        main_model="gpt-4",
        fnames=None,
        pretty=True,
        show_diffs=False,
        auto_commits=True,
        dry_run=False,
    ):
=======
    def __init__(
        self,
        io,
        main_model="gpt-4",
        fnames=None,
        pretty=True,
        show_diffs=False,
        auto_commits=True,
        dry_run=False,
        use_ctags=False,
    ):
        self.use_ctags = use_ctags
>>>>>>> UPDATED
```

These changes add the `--ctags` argument, read the environment variable, and pass the `use_ctags` parameter to the `Coder` class.
2023-05-19 10:02:21 -07:00
Paul Gauthier
8f7d7685d6 improved prompting around ctags 2023-05-19 09:54:27 -07:00
Paul Gauthier
680fc45fb3 improved prompting, fix ctags bug 2023-05-19 09:47:06 -07:00
Paul Gauthier
4593e7812c aider: Replaced Confirm.ask() calls with self.io.confirm_ask() in commands.py.
# Context:
USER: in commands, switch the ask() calls to use the io versions
ASSISTANT: I need to see the content of the `commands.py` file to make the necessary changes. Please provide the content of the file.
USER: Please note that I shared content of these additional files: aider/commands.py
ASSISTANT: I apologize for the oversight. I will now make the necessary changes to the `commands.py` file.

```python
aider/commands.py
<<<<<<< ORIGINAL
                    create_file = Confirm.ask(
                        (
                            f"No files matched '{word}'. Do you want to create the file and add it"
                            " to git?"
                        ),
                    )
                else:
                    create_file = Confirm.ask(
                        f"No files matched '{word}'. Do you want to create the file?"
                    )
=======
                    create_file = self.io.confirm_ask(
                        (
                            f"No files matched '{word}'. Do you want to create the file and add it"
                            " to git?"
                        ),
                    )
                else:
                    create_file = self.io.confirm_ask(
                        f"No files matched '{word}'. Do you want to create the file?"
                    )
>>>>>>> UPDATED
```

I have replaced the `Confirm.ask()` calls with `self.io.confirm_ask()` as requested.
2023-05-19 09:20:54 -07:00
Paul Gauthier
d1551b46be aider: Updated test to pass a string instead of a list when calling cmd_add method.
# Context:
USER: I ran this command:

 pytest tests/test_commands.py

Which produced this output:

============================= test session starts ==============================
platform darwin -- Python 3.11.3, pytest-7.3.1, pluggy-1.0.0
rootdir: /Users/gauthier/Projects/aider
collected 1 item

tests/test_commands.py F                                                 [100%]

=================================== FAILURES ===================================
__________________________ TestCommands.test_cmd_add ___________________________

self = <tests.test_commands.TestCommands testMethod=test_cmd_add>

    def test_cmd_add(self):
        # Create a temporary directory and change the current working directory
        with tempfile.TemporaryDirectory() as tmpdir:
            os.chdir(tmpdir)

            # Initialize the Commands and InputOutput objects
            io = InputOutput(pretty=False, yes=True)
            coder = MagicMock()
            commands = Commands(io, coder)

            # Call the cmd_add method with 'foo.txt' and 'bar.txt'
>           commands.cmd_add(["foo.txt", "bar.txt"])

/Users/gauthier/Projects/aider/tests/test_commands.py:20:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <aider.commands.Commands object at 0x103e2fa50>
args = ['foo.txt', 'bar.txt']

    def cmd_add(self, args):
        "Add matching files to the chat session"

        added_fnames = []
        files = self.coder.get_all_relative_files()
>       for word in args.split():
E       AttributeError: 'list' object has no attribute 'split'

/Users/gauthier/Projects/aider/aider/commands.py:161: AttributeError
=========================== short test summary info ============================
FAILED tests/test_commands.py::TestCommands::test_cmd_add - AttributeError: '...
============================== 1 failed in 0.28s ===============================

ASSISTANT: It seems that the `cmd_add` method in `aider/commands.py` is expecting a string as input, but in the test, we are passing a list. I will update the test to pass a string instead of a list.

Here's the code change:

```python
tests/test_commands.py
<<<<<<< ORIGINAL
            # Call the cmd_add method with 'foo.txt' and 'bar.txt'
            commands.cmd_add(["foo.txt", "bar.txt"])
=======
            # Call the cmd_add method with 'foo.txt' and 'bar.txt' as a single string
            commands.cmd_add("foo.txt bar.txt")
>>>>>>> UPDATED
```

Now, run the test again with the updated test method:

```
pytest tests/test_commands.py
```
2023-05-19 09:16:51 -07:00
Paul Gauthier
e2d5212eec aider: Added a test method test_cmd_add that creates a temporary directory, calls the cmd_add method with 'foo.txt' and 'bar.txt', and checks if both files have been created in the temporary directory.
# Context:
USER: add a test for cmd_add that passes in 'foo.txt' and 'bar.txt' and ensures they have both been created after the test. run the test in a tmp dir.
ASSISTANT: I will add a new test method called `test_cmd_add` in the `tests/test_commands.py` file. This test will create a temporary directory, change the current working directory to the temporary directory, and then call the `cmd_add` method with 'foo.txt' and 'bar.txt' as arguments. After that, it will check if both files have been created in the temporary directory.

Here's the code change:

```python
tests/test_commands.py
<<<<<<< ORIGINAL
=======
import os
import tempfile
from unittest import TestCase
from unittest.mock import MagicMock
from aider.commands import Commands
from aider.io import InputOutput

class TestCommands(TestCase):
    def test_cmd_add(self):
        # Create a temporary directory and change the current working directory
        with tempfile.TemporaryDirectory() as tmpdir:
            os.chdir(tmpdir)

            # Initialize the Commands and InputOutput objects
            io = InputOutput(pretty=False, yes=True)
            coder = MagicMock()
            commands = Commands(io, coder)

            # Call the cmd_add method with 'foo.txt' and 'bar.txt'
            commands.cmd_add(["foo.txt", "bar.txt"])

            # Check if both files have been created in the temporary directory
            self.assertTrue(os.path.exists("foo.txt"))
            self.assertTrue(os.path.exists("bar.txt"))
>>>>>>> UPDATED
```

This test will ensure that the `cmd_add` method creates the specified files in the current working directory.
2023-05-19 09:16:14 -07:00
Paul Gauthier
b9cea2cdb1 Added new files to the git repo: tests/test_commands.py 2023-05-19 09:15:06 -07:00
Paul Gauthier
9536a8d1b9 bugfix 2023-05-19 09:14:55 -07:00
Paul Gauthier
6900e7a282 byebye 2023-05-19 09:09:36 -07:00
Paul Gauthier
5d06cab9e6 aider: Fixed cmd_add method to accept string input instead of list.
# Context:
USER: I ran this command:

 pytest tests/test_commands.py

Which produced this output:

============================= test session starts ==============================
platform darwin -- Python 3.11.3, pytest-7.3.1, pluggy-1.0.0
rootdir: /Users/gauthier/Projects/aider
collected 1 item

tests/test_commands.py F                                                 [100%]

=================================== FAILURES ===================================
__________________________ TestCommands.test_cmd_add ___________________________

self = <tests.test_commands.TestCommands testMethod=test_cmd_add>

    def test_cmd_add(self):
        with tempfile.TemporaryDirectory() as tmpdir:
            original_cwd = os.getcwd()
            os.chdir(tmpdir)

            io = InputOutput(pretty=True, yes=True)
            coder = Coder(io)
            commands = Commands(io, coder)

>           commands.cmd_add(['foo.txt', 'bar.txt'])

/Users/gauthier/Projects/aider/tests/test_commands.py:18:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <aider.commands.Commands object at 0x107e74210>
args = ['foo.txt', 'bar.txt']

    def cmd_add(self, args):
        "Add matching files to the chat session"

        added_fnames = []
        files = self.coder.get_all_relative_files()
>       for word in args.split():
E       AttributeError: 'list' object has no attribute 'split'

/Users/gauthier/Projects/aider/aider/commands.py:161: AttributeError
----------------------------- Captured stdout call -----------------------------
Files are not in a git repo.
No suitable git repo, will not automatically commit edits.
Common root directory:
/private/var/folders/49/kxrdwwbx0h9bchx99397477c0000gn/T/tmptf5hloir
=========================== short test summary info ============================
FAILED tests/test_commands.py::TestCommands::test_cmd_add - AttributeError: '...
============================== 1 failed in 0.73s ===============================

ASSISTANT: I apologize for the mistake. The `cmd_add` method expects a string as input, not a list. We need to modify the test to pass the arguments as a single string.

Here's the code change:

```python
tests/test_commands.py
<<<<<<< ORIGINAL
            commands.cmd_add(['foo.txt', 'bar.txt'])
=======
            commands.cmd_add('foo.txt bar.txt')
>>>>>>> UPDATED
```

This should fix the `AttributeError` and allow the test to run successfully.
2023-05-19 09:08:37 -07:00
Paul Gauthier
3998bf4c2e aider: Fixed InputOutput instantiation in test_cmd_add.
# Context:
USER: I ran this command:

 pytest tests/test_commands.py

Which produced this output:

============================= test session starts ==============================
platform darwin -- Python 3.11.3, pytest-7.3.1, pluggy-1.0.0
rootdir: /Users/gauthier/Projects/aider
collected 1 item

tests/test_commands.py F                                                 [100%]

=================================== FAILURES ===================================
__________________________ TestCommands.test_cmd_add ___________________________

self = <tests.test_commands.TestCommands testMethod=test_cmd_add>

    def test_cmd_add(self):
        with tempfile.TemporaryDirectory() as tmpdir:
            original_cwd = os.getcwd()
            os.chdir(tmpdir)

>           io = InputOutput()
E           TypeError: InputOutput.__init__() missing 2 required positional arguments: 'pretty' and 'yes'

/Users/gauthier/Projects/aider/tests/test_commands.py:14: TypeError
=========================== short test summary info ============================
FAILED tests/test_commands.py::TestCommands::test_cmd_add - TypeError: InputO...
============================== 1 failed in 0.77s ===============================

ASSISTANT: I apologize for the oversight. The `InputOutput` class requires two positional arguments: `pretty` and `yes`. Let's update the test to provide these arguments.

Here's the code change:

```python
tests/test_commands.py
<<<<<<< ORIGINAL
            io = InputOutput()
=======
            io = InputOutput(pretty=True, yes=True)
>>>>>>> UPDATED
```

This should fix the `TypeError` and allow the test to run successfully.
2023-05-19 09:07:56 -07:00
Paul Gauthier
922d28216a aider: Added a test for cmd_add that passes in 'foo.txt' and 'bar.txt' and ensures they have both been created after the test.
# Context:
USER: add a test for cmd_add that passes in 'foo.txt' and 'bar.txt' and ensures they have both been created after the test. run the test in a tmp dir.
ASSISTANT: To add the test for `cmd_add`, we will modify the `tests/test_commands.py` file. Here's the step-by-step plan:

1. Import the necessary libraries and classes.
2. Create a new test method called `test_cmd_add` inside the `TestCommands` class.
3. In the `test_cmd_add` method, create a temporary directory using `tempfile.TemporaryDirectory`.
4. Change the current working directory to the temporary directory.
5. Create an instance of the `InputOutput` and `Coder` classes.
6. Create an instance of the `Commands` class, passing the `InputOutput` and `Coder` instances.
7. Call the `cmd_add` method with the arguments `['foo.txt', 'bar.txt']`.
8. Check if both 'foo.txt' and 'bar.txt' files have been created in the temporary directory.
9. Change the current working directory back to the original directory.

Here's the code change:

```python
tests/test_commands.py
<<<<<<< ORIGINAL
=======
import os
import tempfile
from unittest import TestCase
from aider.io import InputOutput
from aider.coder import Coder
from aider.commands import Commands

class TestCommands(TestCase):
    def test_cmd_add(self):
        with tempfile.TemporaryDirectory() as tmpdir:
            original_cwd = os.getcwd()
            os.chdir(tmpdir)

            io = InputOutput()
            coder = Coder(io)
            commands = Commands(io, coder)

            commands.cmd_add(['foo.txt', 'bar.txt'])

            self.assertTrue(os.path.exists('foo.txt'))
            self.assertTrue(os.path.exists('bar.txt'))

            os.chdir(original_cwd)
>>>>>>> UPDATED
```

This will add the test for `cmd_add` and ensure that both 'foo.txt' and 'bar.txt' have been created after the test.
2023-05-19 09:06:56 -07:00
Paul Gauthier
73853d42ce Added new files to the git repo: tests/test_commands.py 2023-05-19 09:04:59 -07:00
Paul Gauthier
37812084c1 forget about cmd_add test 2023-05-19 09:04:35 -07:00
Paul Gauthier
6dececea84 tweaked layout 2023-05-19 09:04:01 -07:00
Paul Gauthier
73fadbf2f8 wip: Added import statement for get_tags_map function from aider.ctags module. 2023-05-19 08:58:20 -07:00
Paul Gauthier
d4845dfb43 wip: Changed the prompt messages and added a function to show messages. 2023-05-19 08:57:56 -07:00
Paul Gauthier
e4d38f89bb return string 2023-05-19 08:51:49 -07:00
Paul Gauthier
f8d8a3528b include files with no tags 2023-05-19 08:47:17 -07:00
Paul Gauthier
dfd2c495ea move import 2023-05-19 08:42:28 -07:00
Paul Gauthier
f5c6667de3 aider: Modified get_tags to run ctags command and capture JSON output.
# Context:
USER: in get_tags, run `ctags --fields=+S --output-format=json $f` on the filename and collect the json output instead of reading json from filename. use that json data for the rest of the func
ASSISTANT: To modify the `get_tags` function in `aider/ctags.py` to run `ctags --fields=+S --output-format=json $f` on the filename and collect the JSON output, we will need to use the `subprocess` module to run the command and capture the output. Here are the changes:

```python
aider/ctags.py
<<<<<<< ORIGINAL
def get_tags(filename):
    with open(filename, "r") as tags_file:
        for line in tags_file:
            tag = json.loads(line)
=======
import subprocess

def get_tags(filename):
    cmd = ["ctags", "--fields=+S", "--output-format=json", filename]
    output = subprocess.check_output(cmd).decode("utf-8")
    for line in output.splitlines():
        tag = json.loads(line)
>>>>>>> UPDATED
```

This change imports the `subprocess` module, replaces the `with open(filename, "r")` block with a `subprocess.check_output` call to run the `ctags` command, and iterates over the output lines instead of the file lines.
2023-05-19 08:42:09 -07:00
Paul Gauthier
efe05b6d8a path 2023-05-19 08:39:04 -07:00
Paul Gauthier
06a33bc1b1 aider: Added path_components variable to store the split path.
# Context:
USER: after relpath, split path into a list of its components
ASSISTANT: ```python
aider/ctags.py
<<<<<<< ORIGINAL
            path = os.path.relpath(path, os.getcwd())
=======
            path = os.path.relpath(path, os.getcwd())
            path_components = path.split(os.sep)
>>>>>>> UPDATED
```
2023-05-19 08:31:26 -07:00
Paul Gauthier
cceb7c3bef Refactor ctags.py to print tags with indentation. 2023-05-19 08:31:00 -07:00