Commit graph

10395 commits

Author SHA1 Message Date
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
Paul Gauthier
7d45b918fc cleanup 2023-05-19 07:14:45 -07:00
Paul Gauthier
95221d58c9 closer 2023-05-19 07:00:12 -07:00
Paul Gauthier
a61d29a552 Added new files to the git repo: desired.txt, current.txt 2023-05-19 06:45:27 -07:00
Paul Gauthier
36bbf879b5 tabbed for brevity 2023-05-19 06:38:19 -07:00
Paul Gauthier
cf63fd31d5 no n/a 2023-05-19 06:24:49 -07:00
Paul Gauthier
4bb0dc72cd aider: Modified ctags.py to accept command line arguments and call print_tags_info on each file provided.
# Context:
USER: take filenames from the cmd line, call print_tags_info on each
ASSISTANT: To achieve this, we will modify the `aider/ctags.py` file to accept command line arguments and call `print_tags_info` on each file provided.

1. Import the `sys` module to access command line arguments.
2. Modify the `print_tags_info` function to accept a filename parameter.
3. Update the `with open` statement to use the provided filename.
4. Update the `if __name__ == "__main__":` block to iterate over command line arguments and call `print_tags_info` for each file.

Here are the changes:

```python
aider/ctags.py
<<<<<<< ORIGINAL
import json

def print_tags_info():
    with open("tags.jsonl", "r") as tags_file:
=======
import json
import sys

def print_tags_info(filename):
    with open(filename, "r") as tags_file:
>>>>>>> UPDATED
```

```python
aider/ctags.py
<<<<<<< ORIGINAL
if __name__ == "__main__":
    print_tags_info()
=======
if __name__ == "__main__":
    for filename in sys.argv[1:]:
        print_tags_info(filename)
>>>>>>> UPDATED
```
2023-05-18 18:30:40 -07:00
Paul Gauthier
6e68120acb wip: Changed print statement to remove f-string. 2023-05-18 18:29:37 -07:00
Paul Gauthier
1b3a4084be aider: Added function to load and iterate through tags file and print desired fields.
# Context:
USER: load the tags file and iterate through the records, print scope,kind,name,signature
ASSISTANT: To load the tags file and iterate through the records, you can use the following code:

1. Import the `json` module.
2. Open the `tags.jsonl` file.
3. Iterate through the lines in the file, loading each JSON object.
4. Print the desired fields: scope, kind, name, and signature.

Here's the code:

```python
import json

with open("tags.jsonl", "
^C KeyboardInterrupt
USER: put it in ctags.py
ASSISTANT: Here's the updated `aider/ctags.py` file with the code to load the tags file and iterate through the records, printing scope, kind, name, and signature:

```python
aider/ctags.py
<<<<<<< ORIGINAL
=======
import json

def print_tags_info():
    with open("tags.jsonl", "r") as tags_file:
        for line in tags_file:
            tag = json.loads(line)
            scope = tag.get("scope", "N/A")
            kind = tag.get("kind", "N/A")
            name = tag.get("name", "N/A")
            signature = tag.get("signature", "N/A")
            print(f"Scope: {scope}, Kind: {kind}, Name: {name}, Signature: {signature}")

if __name__ == "__main__":
    print_tags_info()
>>>>>>> UPDATED
```

This code defines a function `print_tags_info()` that reads the `tags.jsonl` file, iterates through the records, and prints the desired fields. The `if __name__ == "__main__":` block allows the script to be run directly.
2023-05-18 18:28:21 -07:00
Paul Gauthier
5e010422e2 Added new files to the git repo: tags.jsonl, aider/ctags.py 2023-05-18 18:26:24 -07:00
Paul Gauthier
ba9307374e cleanup Coder params 2023-05-18 18:21:44 -07:00
Paul Gauthier
a59575fa4b wip: Removed unused import from test_commands.py. 2023-05-18 18:17:38 -07:00
Paul Gauthier
78af36ffda cleanup 2023-05-18 18:17:02 -07:00
Paul Gauthier
7fc02ccd66 wip 2023-05-18 18:15:41 -07:00
Paul Gauthier
b2846fa73a aider: Created and added foo.txt to git. 2023-05-18 18:13:07 -07:00
Paul Gauthier
ad865fe0f4 removed yes 2023-05-18 18:12:27 -07:00
Paul Gauthier
59c3fef150 aider: Updated test_cmd_add method in tests/test_commands.py to pass yes=True when creating a Coder instance.
# Context:
USER: call Coder with yes=True
ASSISTANT: I will update the `test_cmd_add` method in the `tests/test_commands.py` file to pass `yes=True` when creating a `Coder` instance.

```python
tests/test_commands.py
<<<<<<< ORIGINAL
            coder = Coder(main_model="gpt-3.5-turbo", fnames=[], pretty=False, show_diffs=False, auto_commits=False, io=io, dry_run=False)
=======
            coder = Coder(main_model="gpt-3.5-turbo", fnames=[], pretty=False, show_diffs=False, auto_commits=False, io=io, dry_run=False, yes=True)
>>>>>>> UPDATED
```
2023-05-18 18:10:30 -07:00
Paul Gauthier
7e6c6b3b92 initialize cur_ and done_messages 2023-05-18 18:09:37 -07:00
Paul Gauthier
97a5e696d8 aider: Created and added bar.txt to git. 2023-05-18 18:07:30 -07:00