Fixed #36376 -- Fixed --no-color for command help in Python 3.14+.

https://github.com/python/cpython/pull/136809 made `color` default to
True in ArgumentParser.
This commit is contained in:
Skyiesac
2025-12-18 16:35:38 +05:30
committed by Jacob Walls
parent 6025eab3c5
commit d0d85cd165
4 changed files with 40 additions and 3 deletions

View File

@@ -58,8 +58,11 @@ class CommandParser(ArgumentParser):
):
self.missing_args_message = missing_args_message
self.called_from_command_line = called_from_command_line
if PY314 and not PY315:
kwargs.setdefault("suggest_on_error", True)
if PY314:
if not PY315:
kwargs.setdefault("suggest_on_error", True)
if os.environ.get("DJANGO_COLORS") == "nocolor" or "--no-color" in sys.argv:
kwargs.setdefault("color", False)
super().__init__(**kwargs)
def parse_args(self, args=None, namespace=None):

View File

@@ -9,4 +9,6 @@ Django 5.2.10 fixes several bugs in 5.2.9.
Bugfixes
========
* ...
* Fixed a bug where management command colorized help (introduced in
Python 3.14) ignored the :option:`--no-color` option and the
:envvar:`DJANGO_COLORS` setting (:ticket:`36376`).

View File

@@ -16,3 +16,7 @@ Bugfixes
* Fixed a regression in Django 6.0 that prevented changing the name of a
:class:`~django.db.models.ManyToManyField` from taking effect when applying
migrations (:ticket:`36800`).
* Fixed a bug where management command colorized help (introduced in
Python 3.14) ignored the :option:`--no-color` option and the
:envvar:`DJANGO_COLORS` setting (:ticket:`36376`).

View File

@@ -470,6 +470,34 @@ class CommandTests(SimpleTestCase):
)
self.assertFalse(parser.suggest_on_error)
@unittest.skipUnless(PY314, "Only relevant for Python 3.14+")
def test_color_enabled_by_default(self):
with mock.patch.dict(os.environ, {}, clear=True):
command = BaseCommand()
parser = command.create_parser("prog_name", "subcommand")
self.assertTrue(parser.color)
@unittest.skipUnless(PY314, "Only relevant for Python 3.14+")
def test_color_disabled_with_django_colors_nocolor(self):
with mock.patch.dict(os.environ, {"DJANGO_COLORS": "nocolor"}):
command = BaseCommand()
parser = command.create_parser("prog_name", "subcommand")
self.assertFalse(parser.color)
@unittest.skipUnless(PY314, "Only relevant for Python 3.14+")
def test_force_color_does_not_affect_argparse_color(self):
with mock.patch.dict(os.environ, {}, clear=True):
command = BaseCommand(force_color=True)
parser = command.create_parser("prog_name", "subcommand")
self.assertTrue(parser.color)
@unittest.skipUnless(PY314, "Only relevant for Python 3.14+")
def test_no_color_flag_disables_color(self):
with mock.patch.object(sys, "argv", ["manage.py", "mycommand", "--no-color"]):
command = BaseCommand()
parser = command.create_parser("manage.py", "mycommand")
self.assertFalse(parser.color)
class CommandRunTests(AdminScriptTestCase):
"""