Honor the NO_COLOR environment variable

The user pastes the specification of the NO_COLOR environment variable protocol from no-color.org into the aider chat.

Aider figures out which files need to be edited, and asks permission to make changes. It then disables all the color and pretty-printing functions if NO_COLOR is set, so the tool conforms to the specification.

The user then asks for a test case, which aider adds as well.

$ aider
Using git repo: .git
Use /help to see in-chat commands.

Command-line software which adds ANSI color to its output by default should check for a NO_COLOR environment variable that, when present and not an empty string (regardless of its value), prevents the addition of ANSI color.

To implement this feature, we need to modify the aider/io.py file. Please make it read-write so I can provide the necessary changes.

aider/io.py
Add these files to the chat? y

Great! Now, I will make the necessary changes to check for the NO_COLOR environment variable and disable ANSI color when it is present and not an empty string.

aider/io.py
<<<<<<< ORIGINAL
import os
=======
import os
import os.path
>>>>>>> UPDATED
aider/io.py
<<<<<<< ORIGINAL
    def __init__(
        self,
        pretty=True,
        yes=False,
        input_history_file=None,
        chat_history_file=None,
        input=None,
        output=None,
        user_input_color="blue",
        tool_output_color=None,
        tool_error_color="red",
    ):
        self.user_input_color = user_input_color
        self.tool_output_color = tool_output_color
        self.tool_error_color = tool_error_color
        self.input = input
        self.output = output
        self.pretty = pretty
        self.yes = yes
        self.input_history_file = input_history_file
        if chat_history_file is not None:
            self.chat_history_file = Path(chat_history_file)
        else:
            self.chat_history_file = None

        if pretty:
            self.console = Console()
        else:
            self.console = Console(force_terminal=True, no_color=True)
=======
    def __init__(
        self,
        pretty=True,
        yes=False,
        input_history_file=None,
        chat_history_file=None,
        input=None,
        output=None,
        user_input_color="blue",
        tool_output_color=None,
        tool_error_color="red",
    ):
        no_color = os.environ.get("NO_COLOR")
        if no_color is not None and no_color != "":
            pretty = False

        self.user_input_color = user_input_color if pretty else None
        self.tool_output_color = tool_output_color if pretty else None
        self.tool_error_color = tool_error_color if pretty else None
        self.input = input
        self.output = output
        self.pretty = pretty
        self.yes = yes
        self.input_history_file = input_history_file
        if chat_history_file is not None:
            self.chat_history_file = Path(chat_history_file)
        else:
            self.chat_history_file = None

        self.console = Console(force_terminal=not pretty, no_color=not pretty)
>>>>>>> UPDATED

These changes will make the software check for the NO_COLOR environment variable and disable ANSI color when it is present and not an empty string.

Applied edit to aider/io.py
Applied edit to aider/io.py
Commit 3218242 aider: Added check for NO_COLOR environment variable to disable ANSI color.

add a test

To add a test for the NO_COLOR environment variable, we will create a new test function in the tests/test_io.py file. Since this file does not exist, we will create it first.

tests/test_io.py
<<<<<<< ORIGINAL
=======
import os
import unittest
from unittest.mock import patch
from aider.io import InputOutput

class TestInputOutput(unittest.TestCase):
    def test_no_color_environment_variable(self):
        with patch.dict(os.environ, {"NO_COLOR": "1"}):
            io = InputOutput()
            self.assertFalse(io.pretty)

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

This test function checks if the pretty attribute of the InputOutput class is set to False when the NO_COLOR environment variable is set.

Allow creation of new file tests/test_io.py? y
Add tests/test_io.py to git? y
Applied edit to tests/test_io.py
Commit 52a9df5 aider: Added a test function to check if the pretty attribute of the InputOutput class is set to False when the NO_COLOR environment variable is set.

/run pytest

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

tests/test_coder.py …… [ 24%]
tests/test_commands.py . [ 28%]
tests/test_io.py . [ 32%]
tests/test_main.py …. [ 48%]
tests/test_repomap.py … [ 60%]
tests/test_utils.py ………. [100%]

============================== 25 passed in 1.41s ==============================

Add the output to the chat? y