Commit graph

1638 commits

Author SHA1 Message Date
Paul Gauthier
1aa8699e15 Updated versionbump.py to include the new version in the error message and print the updated content when running in dry-run mode. 2023-06-17 07:24:11 -07:00
Paul Gauthier
2b1fab43a1 aider: Added a --dry-run argument to the scripts/versionbump.py script to print each step without actually modifying the __init__.py file or running the git commands.
# Context:
USER: add a --dry-run arg that just prints each step, so it won't overwrite __init__.py or actually rnu the git cmds
ASSISTANT: I will add a `--dry-run` argument to the `scripts/versionbump.py` script. When this argument is provided, the script will print each step without actually modifying the `__init__.py` file or running the git commands.

Here are the changes:

```python
scripts/versionbump.py
<<<<<<< ORIGINAL
def main():
    parser = argparse.ArgumentParser(description="Bump version")
    parser.add_argument("new_version", help="New version in x.y.z format")
=======
def main():
    parser = argparse.ArgumentParser(description="Bump version")
    parser.add_argument("new_version", help="New version in x.y.z format")
    parser.add_argument("--dry-run", action="store_true", help="Print each step without actually executing them")
>>>>>>> UPDATED

scripts/versionbump.py
<<<<<<< ORIGINAL
    args = parser.parse_args()
=======
    args = parser.parse_args()
    dry_run = args.dry_run
>>>>>>> UPDATED

scripts/versionbump.py
<<<<<<< ORIGINAL
    with open("aider/__init__.py", "w") as f:
        f.write(updated_content)
=======
    if dry_run:
        print("Updating aider/__init__.py with new version")
    else:
        with open("aider/__init__.py", "w") as f:
            f.write(updated_content)
>>>>>>> UPDATED

scripts/versionbump.py
<<<<<<< ORIGINAL
    subprocess.run(["git", "add", "aider/__init__.py"], check=True)
    subprocess.run(["git", "commit", "-m", f"version bump to {new_version}"], check=True)
    subprocess.run(["git", "tag", f"v{new_version}"], check=True)
    subprocess.run(["git", "push", "origin"], check=True)
    subprocess.run(["git", "push", "origin", f"v{new_version}"], check=True)
=======
    git_commands = [
        ["git", "add", "aider/__init__.py"],
        ["git", "commit", "-m", f"version bump to {new_version}"],
        ["git", "tag", f"v{new_version}"],
        ["git", "push", "origin"],
        ["git", "push", "origin", f"v{new_version}"],
    ]

    for cmd in git_commands:
        if dry_run:
            print(f"Running: {' '.join(cmd)}")
        else:
            subprocess.run(cmd, check=True)
>>>>>>> UPDATED
```

Now you can run the script with the `--dry-run` argument to see the steps without actually executing them:

```bash
python scripts/versionbump.py x.y.z --dry-run
```
2023-06-17 07:22:45 -07:00
Paul Gauthier
2181923859 aider: Added check=True parameter to subprocess.run() calls in scripts/versionbump.py to raise CalledProcessError exception if any of the git commands fail.
# Context:
USER: will those `subprocess` calls raise exceptions if the git commands error?
ASSISTANT: Yes, by default, the `subprocess.run()` function will not raise an exception if the command returns a non-zero exit code. However, you can add the `check=True` parameter to the `subprocess.run()` calls to make them raise a `CalledProcessError` exception if the command returns a non-zero exit code. Here's the updated `scripts/versionbump.py` with the `check=True` parameter added:

```python
scripts/versionbump.py
<<<<<<< ORIGINAL
    subprocess.run(["git", "add", "aider/__init__.py"])
    subprocess.run(["git", "commit", "-m", f"version bump to {new_version}"])
    subprocess.run(["git", "tag", f"v{new_version}"])
    subprocess.run(["git", "push", "origin"])
    subprocess.run(["git", "push", "origin", f"v{new_version}"])
=======
    subprocess.run(["git", "add", "aider/__init__.py"], check=True)
    subprocess.run(["git", "commit", "-m", f"version bump to {new_version}"], check=True)
    subprocess.run(["git", "tag", f"v{new_version}"], check=True)
    subprocess.run(["git", "push", "origin"], check=True)
    subprocess.run(["git", "push", "origin", f"v{new_version}"], check=True)
>>>>>>> UPDATED
```

With these changes, if any of the git commands fail, the script will raise a `CalledProcessError` exception and terminate.
2023-06-17 07:20:58 -07:00
Paul Gauthier
25ae54f6bf aider: Updated versionbump.py script to handle version bumping, git commit, tag, and push.
# Context:
USER: write a dcript that takes x.y.z semver on the cmd line. it should:
1. verify that the version is greater than `__version__`
2. wupdate the `__version__` in init.py
3. git commit that change with msg `version bump to x.y.z`
4. git tag that new commit with "vx.y.z" (note the leading v)
5. git push to origin
6. git push the new tag to origin

ASSISTANT: I will create a new script called `scripts/versionbump.py` to handle the version bumping process. Here are the changes:

```python
scripts/versionbump.py
<<<<<<< ORIGINAL
=======
import argparse
import os
import re
import subprocess
from packaging import version

def main():
    parser = argparse.ArgumentParser(description="Bump version")
    parser.add_argument("new_version", help="New version in x.y.z format")
    args = parser.parse_args()

    new_version = version.parse(args.new_version)
    if not isinstance(new_version, version.Version):
        raise ValueError("Invalid version format")

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

    current_version = re.search(r'__version__ = "(.+?)"', content).group(1)
    if new_version <= version.parse(current_version):
        raise ValueError("New version must be greater than the current version")

    updated_content = re.sub(r'__version__ = ".+?"', f'__version__ = "{new_version}"', content)

    with open("aider/__init__.py", "w") as f:
        f.write(updated_content)

    subprocess.run(["git", "add", "aider/__init__.py"])
    subprocess.run(["git", "commit", "-m", f"version bump to {new_version}"])
    subprocess.run(["git", "tag", f"v{new_version}"])
    subprocess.run(["git", "push", "origin"])
    subprocess.run(["git", "push", "origin", f"v{new_version}"])

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

This script will perform the requested actions. Make sure to install the `packaging` library if you haven't already:

```bash
pip install packaging
```

You can run the script with the new version as an argument:

```bash
python scripts/versionbump.py x.y.z
```
2023-06-17 07:20:02 -07:00
Paul Gauthier
6f5496d201 Added new files to the git repo: scripts/versionbump.py 2023-06-17 07:17:05 -07:00
Paul Gauthier
1751025766 version bump 2023-06-17 07:15:49 -07:00
Paul Gauthier
143d20b1e6 Upgrade to new actions versions 2023-06-17 07:12:05 -07:00
Paul Gauthier
0ca0db3edf fix; bump to 0.6.4 2023-06-17 07:08:45 -07:00
Paul Gauthier
9fc0b9d696 bump to 0.6.3 2023-06-17 07:07:13 -07:00
Paul Gauthier
8fc4f32117 Changed version flag to use long option. 2023-06-17 07:06:33 -07:00
Paul Gauthier
d8938ee033 aider: Added support for --version flag to display the version number.
# Context:
USER: should `aider --help` show the version now?
ASSISTANT: Yes, with the changes you made, running `aider --help` should show the version information. However, the version will be displayed when you run `aider --version`. The `--help` output will include a line mentioning the `--version` flag, but it won't directly show the version number.
USER: I ran this command:

 aider --version

And got this output:

Traceback (most recent call last):
  File "/Users/gauthier/Projects/aider/.venv/bin/aider", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/Users/gauthier/Projects/aider/aider/main.py", line 32, in main
    parser = configargparse.ArgumentParser(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/gauthier/Projects/aider/.venv/lib/python3.11/site-packages/configargparse.py", line 433, in __init__
    argparse.ArgumentParser.__init__(self, *args, **kwargs)
TypeError: ArgumentParser.__init__() got an unexpected keyword argument 'version'

ASSISTANT: I apologize for the confusion earlier. It seems I made a mistake. `configargparse` does not have a built-in `version` parameter like `argparse`. Instead, you can add a custom argument with the `--version` flag and handle it manually. Here's how you can modify your `aider/main.py` file:

```python
aider/main.py
<<<<<<< ORIGINAL
    parser = configargparse.ArgumentParser(
        description="aider is GPT powered coding in your terminal",
        add_config_file_help=True,
        default_config_files=default_config_files,
        config_file_parser_class=configargparse.YAMLConfigFileParser,
        auto_env_var_prefix="AIDER_",
        version=__version__,
    )
=======
    parser = configargparse.ArgumentParser(
        description="aider is GPT powered coding in your terminal",
        add_config_file_help=True,
        default_config_files=default_config_files,
        config_file_parser_class=configargparse.YAMLConfigFileParser,
        auto_env_var_prefix="AIDER_",
    )

    parser.add_argument(
        "--version",
        action="store_true",
        help="Show the version number and exit",
    )
>>>>>>> UPDATED
```

```python
aider/main.py
<<<<<<< ORIGINAL
    args = parser.parse_args(args)
=======
    args, unknown_args = parser.parse_known_args(args)

    if args.version:
        print(f"aider version {__version__}")
        sys.exit(0)

    # Re-parse the arguments to include unknown_args
    args = parser.parse_args(args + unknown_args)

^C KeyboardInterrupt
USER: can we add soemthing like this: parser.add_argument('-v', '--version', action='version', version='%(prog)s ' + __version__)

ASSISTANT: I apologize for the confusion earlier. It turns out that `configargparse` does support the `version` action, similar to `argparse`. You can add the `--version` argument as you suggested. Here's how you can modify your `aider/main.py` file:

```python
aider/main.py
<<<<<<< ORIGINAL
    parser = configargparse.ArgumentParser(
        description="aider is GPT powered coding in your terminal",
        add_config_file_help=True,
        default_config_files=default_config_files,
        config_file_parser_class=configargparse.YAMLConfigFileParser,
        auto_env_var_prefix="AIDER_",
        version=__version__,
    )
=======
    parser = configargparse.ArgumentParser(
        description="aider is GPT powered coding in your terminal",
        add_config_file_help=True,
        default_config_files=default_config_files,
        config_file_parser_class=configargparse.YAMLConfigFileParser,
        auto_env_var_prefix="AIDER_",
    )

    parser.add_argument(
        "-v", "--version", action="version", version=f"%(prog)s {__version__}", help="Show the version number and exit"
    )
>>>>>>> UPDATED
```

Now, running `aider --version` or `aider -v` will display the version number as expected.
2023-06-17 07:05:58 -07:00
Paul Gauthier
cdb62c1462 aider: Added version to argparse in main.py.
# Context:
USER: now import `__version__` into main and pass it to `configargparse`
ASSISTANT: To import `__version__` into `aider/main.py` and pass it to `configargparse`, you can modify the `aider/main.py` file as follows:

```python
aider/main.py
<<<<<<< ORIGINAL
import os
import sys

import configargparse
import git

from aider import models
from aider.coder import Coder
from aider.io import InputOutput
=======
import os
import sys

import configargparse
import git

from aider import models, __version__
from aider.coder import Coder
from aider.io import InputOutput
>>>>>>> UPDATED
```

```python
aider/main.py
<<<<<<< ORIGINAL
    parser = configargparse.ArgumentParser(
        description="aider is GPT powered coding in your terminal",
        add_config_file_help=True,
        default_config_files=default_config_files,
        config_file_parser_class=configargparse.YAMLConfigFileParser,
        auto_env_var_prefix="AIDER_",
    )
=======
    parser = configargparse.ArgumentParser(
        description="aider is GPT powered coding in your terminal",
        add_config_file_help=True,
        default_config_files=default_config_files,
        config_file_parser_class=configargparse.YAMLConfigFileParser,
        auto_env_var_prefix="AIDER_",
        version=__version__,
    )
>>>>>>> UPDATED
```

Now, the version from `aider/__init__.py` will be passed to `configargparse.ArgumentParser`, and it will be displayed in the help output when the user runs your tool with the `--version` flag.
2023-06-17 07:01:44 -07:00
Paul Gauthier
79f6be2163 aider: Added __version__ variable to aider/__init__.py and imported it in setup.py.
# Context:
USER: is it safe/sensible to put __version__ into `aider/__init__.py` and have setup.py import that to learn the version?
ASSISTANT: Yes, it is safe and sensible to put the `__version__` variable in `aider/__init__.py` and have `setup.py` import it to learn the version. This is a common practice in Python projects to maintain a single source of truth for the package version.

Here's how you can modify the `aider/__init__.py` and `setup.py` files:

```python
aider/__init__.py
<<<<<<< ORIGINAL
=======
__version__ = "0.6.2"
>>>>>>> UPDATED
```

```python
setup.py
<<<<<<< ORIGINAL
import re

with open("README.md", "r", encoding="utf-8") as f:
    long_description = f.read()
    long_description = re.sub(r"\n!\[.*\]\(.*\)", "", long_description)
    long_description = re.sub(r"\n- \[.*\]\(#.*\)", "", long_description)

setup(
    name="aider-chat",
    version="0.6.2",
=======
from aider import __version__

with open("README.md", "r", encoding="utf-8") as f:
    long_description = f.read()
    long_description = re.sub(r"\n!\[.*\]\(.*\)", "", long_description)
    long_description = re.sub(r"\n- \[.*\]\(#.*\)", "", long_description)

setup(
    name="aider-chat",
    version=__version__,
>>>>>>> UPDATED
```

This way, you can maintain the version in `aider/__init__.py` and `setup.py` will always use the correct version.
2023-06-17 06:59:58 -07:00
Paul Gauthier
373b2e3b35 Changed the description of the CLI tool to be more descriptive. 2023-06-17 06:59:10 -07:00
Paul Gauthier
14d42ee79d bump setup.py to 0.6.2 2023-06-17 06:47:24 -07:00
Paul Gauthier
7708b2b271 bump setup.py to 0.6.1 2023-06-17 06:46:13 -07:00
Paul Gauthier
fc30663ce4 aider: work in progress
# Context:
USER: can i use github actions to make it easy to release a new version on github and pypi
ASSISTANT: Yes, you can use GitHub Actions to automate the release process for both GitHub and PyPI. To do this, you'll need to create a new GitHub Actions workflow file and configure it with the necessary steps.

Please follow these steps:

1. Create a new file named `release.yml` in the `.github/workflows/` directory of your repository. If the directory doesn't exist, create it.

```yaml
.github/workflows/release.yml
<<<<<<< ORIGINAL
=======
name: Release

on:
  push:
    tags:
      - 'v*'

jobs:
  build_and_publish:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: 3.x

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install setuptools wheel twine

    - name: Build and publish
      env:
        TWINE_USERNAME: __token__
        TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
      run: |
        python setup.py sdist bdist_wheel
        twine upload dist/*
>>>>>>> UPDATED
```

2. Replace `PYPI_API_TOKEN` in the `TWINE_PASSWORD` line with your actual PyPI API token. You can create an API token by following the instructions in the [PyPI documentation](https://pypi.org/manage/account/token/).

3. Commit and push the changes to your repository.

Now, whenever you push a new tag starting with 'v' (e.g., `v1.0.0`), the GitHub Actions workflow will automatically build and publish your package to PyPI.

Please note that you'll need to have a `setup.py` file in your repository for this workflow to work correctly. If you don't have one, please let me know, and I can help you create one.
2023-06-17 06:44:02 -07:00
Paul Gauthier
89d9d17b2a bump setup.py to 0.6.0 2023-06-17 06:41:45 -07:00
Paul Gauthier
be4ed9477a Merge remote-tracking branch 'origin/main' 2023-06-15 06:26:37 -07:00
Paul Gauthier
8fb4ab2be3 cleaned up Model init 2023-06-15 06:26:16 -07:00
paul-gauthier
4d5eeac9bf
Update README.md 2023-06-14 19:57:29 -07:00
Paul Gauthier
bd91cb7fb7 copy 2023-06-14 19:33:39 -07:00
Paul Gauthier
cc7a77eb05 Improved initial config messages 2023-06-14 19:23:47 -07:00
Paul Gauthier
8660d35601 More flexible models 2023-06-14 17:51:17 -07:00
Paul Gauthier
8b5dcecbe2 aider: Added regex to extract tokens from name in get_model function.
# Context:
USER: use a regex to check `name` for "-XXk" and set tokens = the number XX
ASSISTANT: To use a regex to check for "-XXk" in the `name` and set `tokens` to the number XX, you can modify the `get_model` function in the `aider/models.py` file. Here's the updated code:

```python
aider/models.py
<<<<<<< ORIGINAL
def get_model(name):
    models = GPT35_models + GPT4_models

    for model in models:
        if model.name == name:
            return model

    tokens = 0

    model = Model(name, tokens)
=======
import re

def get_model(name):
    models = GPT35_models + GPT4_models

    for model in models:
        if model.name == name:
            return model

    match = re.search(r'-([0-9]+)k', name)
    tokens = int(match.group(1)) if match else 0

    model = Model(name, tokens)
>>>>>>> UPDATED
```

This change imports the `re` module and uses the `re.search()` function to find the "-XXk" pattern in the `name`. If the pattern is found, it sets `tokens` to the number XX.
2023-06-14 17:11:29 -07:00
Paul Gauthier
8c91e107e0 wip 2023-06-14 17:10:27 -07:00
Paul Gauthier
67ee800c55 refactor models to add gpt-4-32k-0613 2023-06-14 17:09:53 -07:00
Paul Gauthier
ce8069196c Improve messaging about universal ctags 2023-06-14 16:12:51 -07:00
Paul Gauthier
be34086ac0 aider: Captured stdout/err in check_for_ctags subprocess call.
# Context:
USER: in `check_for_ctags` capture stdout/err so they aren't displayed
ASSISTANT: No changes are needed.
2023-06-14 15:58:47 -07:00
Paul Gauthier
6a5f3e6bc5 copy 2023-06-14 07:18:17 -07:00
Paul Gauthier
91fed81c31 copy 2023-06-14 06:21:00 -07:00
Paul Gauthier
b7d229ac03 copy 2023-06-13 19:29:39 -07:00
Paul Gauthier
d54cc275dd copy 2023-06-13 19:28:45 -07:00
Paul Gauthier
29a4f947ee copy 2023-06-13 13:07:24 -07:00
Paul Gauthier
246204868e copy 2023-06-13 13:06:04 -07:00
Paul Gauthier
3b4c43eda1 copy 2023-06-13 13:05:22 -07:00
Paul Gauthier
99cbd10b56 copy 2023-06-13 12:28:40 -07:00
Paul Gauthier
9da118308b copy 2023-06-13 12:27:42 -07:00
Paul Gauthier
25a28e6f9c Improved support for gpt-3.5-turbo-16k 2023-06-13 12:19:56 -07:00
Paul Gauthier
e468763c7d Updated README for gpt-3.5-turbo-16k 2023-06-13 12:06:55 -07:00
Paul Gauthier
1ce38d230b Added basic support for gpt-3.5-turbo-16k 2023-06-13 11:59:03 -07:00
Paul Gauthier
131245fa64 Fix bug when gpt35 can not make a dirty commit message 2023-06-10 14:23:04 -07:00
paul-gauthier
39d24d9e24
Merge pull request #18 from paul-gauthier/issue-17
Added:  --openai-api-base OPENAI_API_BASE
2023-06-10 10:54:22 -07:00
Paul Gauthier
193901ee43 Changed OpenAI API base endpoint to https://api.openai.com/v1. 2023-06-10 10:50:45 -07:00
Paul Gauthier
3e7f791112 aider: Added support for passing openai_api_base into the Coder class.
# Context:
USER: we need to pass `openai_api_base` into Coder
ASSISTANT: To pass `openai_api_base` into the Coder class, you need to modify the `aider/main.py` file and update the Coder class instantiation. Here's the change you need to make:

```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,
        dirty_commits=args.dirty_commits,
        dry_run=args.dry_run,
        map_tokens=args.map_tokens,
        verbose=args.verbose,
        openai_api_key=args.openai_api_key,
    )
=======
    coder = Coder(
        io,
        main_model=args.model,
        fnames=args.files,
        pretty=args.pretty,
        show_diffs=args.show_diffs,
        auto_commits=args.auto_commits,
        dirty_commits=args.dirty_commits,
        dry_run=args.dry_run,
        map_tokens=args.map_tokens,
        verbose=args.verbose,
        openai_api_key=args.openai_api_key,
        openai_api_base=args.openai_api_base,
    )
>>>>>>> UPDATED
```

Now, you also need to update the `__init__` method of the Coder class in the `aider/coder.py` file to accept the `openai_api_base` argument and use it:

```python
aider/coder.py
<<<<<<< ORIGINAL
    def __init__(
        self,
        io,
        main_model=models.GPT4.name,
        fnames=None,
        pretty=True,
        show_diffs=False,
        auto_commits=True,
        dirty_commits=True,
        dry_run=False,
        map_tokens=1024,
        verbose=False,
        openai_api_key=None,
    ):
        if not openai_api_key:
            raise MissingAPIKeyError("No OpenAI API key provided.")
        openai.api_key = openai_api_key
        openai.api_base = args.openai_api_base
=======
    def __init__(
        self,
        io,
        main_model=models.GPT4.name,
        fnames=None,
        pretty=True,
        show_diffs=False,
        auto_commits=True,
        dirty_commits=True,
        dry_run=False,
        map_tokens=1024,
        verbose=False,
        openai_api_key=None,
        openai_api_base=None,
    ):
        if not openai_api_key:
            raise MissingAPIKeyError("No OpenAI API key provided.")
        openai.api_key = openai_api_key
        openai.api_base = openai_api_base
>>>>>>> UPDATED
```

These changes will allow you to pass the `openai_api_base` value into the Coder class and use it.
2023-06-10 10:40:54 -07:00
Paul Gauthier
3bef60ecf0 aider: Added option to set OpenAI API base endpoint.
# Context:
USER: is it possible to add OPEN_AI_BASE or openai.api_base endpoint

default:
openai.api_base = "https://api.openai.com/v1/chat/completions"

ASSISTANT: Yes, you can add an option to set the OpenAI API base endpoint. Here's how to do it:

1. Add a new argument to the argument parser in `aider/main.py`.
2. Set the `openai.api_base` in the `Coder` class in `aider/coder.py`.

Here are the changes you need to make:

```python
aider/main.py
<<<<<<< ORIGINAL
    parser.add_argument(
        "--openai-api-key",
        metavar="OPENAI_API_KEY",
        help="Specify the OpenAI API key",
        env_var="OPENAI_API_KEY",
    )
=======
    parser.add_argument(
        "--openai-api-key",
        metavar="OPENAI_API_KEY",
        help="Specify the OpenAI API key",
        env_var="OPENAI_API_KEY",
    )
    parser.add_argument(
        "--openai-api-base",
        metavar="OPENAI_API_BASE",
        default="https://api.openai.com/v1/chat/completions",
        help="Specify the OpenAI API base endpoint (default: https://api.openai.com/v1/chat/completions)",
    )
>>>>>>> UPDATED
```

```python
aider/coder.py
<<<<<<< ORIGINAL
        if openai_api_key:
            openai.api_key = openai_api_key
        else:
            raise MissingAPIKeyError("No OpenAI API key provided.")
=======
        if not openai_api_key:
            raise MissingAPIKeyError("No OpenAI API key provided.")
        openai.api_key = openai_api_key
        openai.api_base = args.openai_api_base
>>>>>>> UPDATED
```

Now you can use the `--openai-api-base` option to set the OpenAI API base endpoint when running the script.
2023-06-10 06:40:15 -07:00
Paul Gauthier
806805c0b1 Ensure leading_whitespace is actually space 2023-06-10 06:16:22 -07:00
Paul Gauthier
8d408e1fc4 Try replace_part_with_missing_leading_whitespace first, so that single line edits get the benefit 2023-06-09 15:05:34 -07:00
Paul Gauthier
737394f9b6 aider: Added a test case for replace_part_with_missing_leading_whitespace function.
# Context:
USER: add a test for `replace_part_with_missing_leading_whitespace`
ASSISTANT: To add a test for `replace_part_with_missing_leading_whitespace`, we will modify the `tests/test_utils.py` file.

```python
tests/test_utils.py
<<<<<<< ORIGINAL
if __name__ == "__main__":
    unittest.main()
=======
    def test_replace_part_with_missing_leading_whitespace(self):
        whole = "    line1\n    line2\n    line3\n"
        part = "line1\nline2"
        replace = "new_line1\nnew_line2"
        expected_output = "    new_line1\n    new_line2\n    line3\n"

        result = utils.replace_part_with_missing_leading_whitespace(whole, part, replace)
        self.assertEqual(result, expected_output)

if __name__ == "__main__":
    unittest.main()
>>>>>>> UPDATED
```

This new test case checks if the `replace_part_with_missing_leading_whitespace` function correctly handles the case when the part and replace blocks have missing leading whitespaces.
2023-06-09 14:52:37 -07:00
Paul Gauthier
5612c8e13d Don't indent blank lines 2023-06-09 14:51:37 -07:00