Skip to content

Commit 4ac916a

Browse files
authored
gh-130645: Add color to stdlib argparse CLIs (gh-133380)
1 parent 2b4e2b7 commit 4ac916a

36 files changed

+66
-33
lines changed

Lib/ast.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ def main(args=None):
630630
import argparse
631631
import sys
632632

633-
parser = argparse.ArgumentParser()
633+
parser = argparse.ArgumentParser(color=True)
634634
parser.add_argument('infile', nargs='?', default='-',
635635
help='the file to parse; defaults to stdin')
636636
parser.add_argument('-m', '--mode', default='exec',

Lib/calendar.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,7 @@ def timegm(tuple):
810810

811811
def main(args=None):
812812
import argparse
813-
parser = argparse.ArgumentParser()
813+
parser = argparse.ArgumentParser(color=True)
814814
textgroup = parser.add_argument_group('text only arguments')
815815
htmlgroup = parser.add_argument_group('html only arguments')
816816
textgroup.add_argument(

Lib/code.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ def interact(banner=None, readfunc=None, local=None, exitmsg=None, local_exit=Fa
385385
if __name__ == "__main__":
386386
import argparse
387387

388-
parser = argparse.ArgumentParser()
388+
parser = argparse.ArgumentParser(color=True)
389389
parser.add_argument('-q', action='store_true',
390390
help="don't print version and copyright messages")
391391
args = parser.parse_args()

Lib/compileall.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,9 @@ def main():
317317
import argparse
318318

319319
parser = argparse.ArgumentParser(
320-
description='Utilities to support installing Python libraries.')
320+
description='Utilities to support installing Python libraries.',
321+
color=True,
322+
)
321323
parser.add_argument('-l', action='store_const', const=0,
322324
default=None, dest='maxlevels',
323325
help="don't recurse into subdirectories")

Lib/dis.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1131,7 +1131,7 @@ def dis(self):
11311131
def main(args=None):
11321132
import argparse
11331133

1134-
parser = argparse.ArgumentParser()
1134+
parser = argparse.ArgumentParser(color=True)
11351135
parser.add_argument('-C', '--show-caches', action='store_true',
11361136
help='show inline caches')
11371137
parser.add_argument('-O', '--show-offsets', action='store_true',

Lib/doctest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2870,7 +2870,7 @@ def get(self):
28702870
def _test():
28712871
import argparse
28722872

2873-
parser = argparse.ArgumentParser(description="doctest runner")
2873+
parser = argparse.ArgumentParser(description="doctest runner", color=True)
28742874
parser.add_argument('-v', '--verbose', action='store_true', default=False,
28752875
help='print very verbose output for all tests')
28762876
parser.add_argument('-o', '--option', action='append',

Lib/ensurepip/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ def _uninstall_helper(*, verbosity=0):
205205

206206
def _main(argv=None):
207207
import argparse
208-
parser = argparse.ArgumentParser()
208+
parser = argparse.ArgumentParser(color=True)
209209
parser.add_argument(
210210
"--version",
211211
action="version",

Lib/gzip.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,9 @@ def main():
667667
from argparse import ArgumentParser
668668
parser = ArgumentParser(description=
669669
"A simple command line interface for the gzip module: act like gzip, "
670-
"but do not delete the input file.")
670+
"but do not delete the input file.",
671+
color=True,
672+
)
671673
group = parser.add_mutually_exclusive_group()
672674
group.add_argument('--fast', action='store_true', help='compress faster')
673675
group.add_argument('--best', action='store_true', help='compress better')

Lib/http/server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1340,7 +1340,7 @@ def test(HandlerClass=BaseHTTPRequestHandler,
13401340
import argparse
13411341
import contextlib
13421342

1343-
parser = argparse.ArgumentParser()
1343+
parser = argparse.ArgumentParser(color=True)
13441344
parser.add_argument('--cgi', action='store_true',
13451345
help='run as CGI server')
13461346
parser.add_argument('-b', '--bind', metavar='ADDRESS',

Lib/inspect.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3343,7 +3343,7 @@ def _main():
33433343
import argparse
33443344
import importlib
33453345

3346-
parser = argparse.ArgumentParser()
3346+
parser = argparse.ArgumentParser(color=True)
33473347
parser.add_argument(
33483348
'object',
33493349
help="The object to be analysed. "

Lib/json/tool.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def _colorize_json(json_str):
4444
def main():
4545
description = ('A simple command line interface for json module '
4646
'to validate and pretty-print JSON objects.')
47-
parser = argparse.ArgumentParser(description=description)
47+
parser = argparse.ArgumentParser(description=description, color=True)
4848
parser.add_argument('infile', nargs='?',
4949
help='a JSON file to be validated or pretty-printed',
5050
default='-')

Lib/mimetypes.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,9 @@ def _default_mime_types():
698698
def _parse_args(args):
699699
from argparse import ArgumentParser
700700

701-
parser = ArgumentParser(description='map filename extensions to MIME types')
701+
parser = ArgumentParser(
702+
description='map filename extensions to MIME types', color=True
703+
)
702704
parser.add_argument(
703705
'-e', '--extension',
704706
action='store_true',

Lib/pdb.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3296,10 +3296,13 @@ def help():
32963296
def main():
32973297
import argparse
32983298

3299-
parser = argparse.ArgumentParser(usage="%(prog)s [-h] [-c command] (-m module | -p pid | pyfile) [args ...]",
3300-
description=_usage,
3301-
formatter_class=argparse.RawDescriptionHelpFormatter,
3302-
allow_abbrev=False)
3299+
parser = argparse.ArgumentParser(
3300+
usage="%(prog)s [-h] [-c command] (-m module | -p pid | pyfile) [args ...]",
3301+
description=_usage,
3302+
formatter_class=argparse.RawDescriptionHelpFormatter,
3303+
allow_abbrev=False,
3304+
color=True,
3305+
)
33033306

33043307
# We need to maunally get the script from args, because the first positional
33053308
# arguments could be either the script we need to debug, or the argument

Lib/pickle.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1911,7 +1911,9 @@ def _main(args=None):
19111911
import argparse
19121912
import pprint
19131913
parser = argparse.ArgumentParser(
1914-
description='display contents of the pickle files')
1914+
description='display contents of the pickle files',
1915+
color=True,
1916+
)
19151917
parser.add_argument(
19161918
'pickle_file',
19171919
nargs='+', help='the pickle file')

Lib/pickletools.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2842,7 +2842,9 @@ def __init__(self, value):
28422842
if __name__ == "__main__":
28432843
import argparse
28442844
parser = argparse.ArgumentParser(
2845-
description='disassemble one or more pickle files')
2845+
description='disassemble one or more pickle files',
2846+
color=True,
2847+
)
28462848
parser.add_argument(
28472849
'pickle_file',
28482850
nargs='+', help='the pickle file')

Lib/platform.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1467,7 +1467,7 @@ def invalidate_caches():
14671467
def _parse_args(args: list[str] | None):
14681468
import argparse
14691469

1470-
parser = argparse.ArgumentParser()
1470+
parser = argparse.ArgumentParser(color=True)
14711471
parser.add_argument("args", nargs="*", choices=["nonaliased", "terse"])
14721472
parser.add_argument(
14731473
"--terse",

Lib/py_compile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def main():
177177
import argparse
178178

179179
description = 'A simple command-line interface for py_compile module.'
180-
parser = argparse.ArgumentParser(description=description)
180+
parser = argparse.ArgumentParser(description=description, color=True)
181181
parser.add_argument(
182182
'-q', '--quiet',
183183
action='store_true',

Lib/random.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1011,7 +1011,7 @@ def _test(N=10_000):
10111011
def _parse_args(arg_list: list[str] | None):
10121012
import argparse
10131013
parser = argparse.ArgumentParser(
1014-
formatter_class=argparse.RawTextHelpFormatter)
1014+
formatter_class=argparse.RawTextHelpFormatter, color=True)
10151015
group = parser.add_mutually_exclusive_group()
10161016
group.add_argument(
10171017
"-c", "--choice", nargs="+",

Lib/sqlite3/__main__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ def runsource(self, source, filename="<input>", symbol="single"):
6565
def main(*args):
6666
parser = ArgumentParser(
6767
description="Python sqlite3 CLI",
68+
color=True,
6869
)
6970
parser.add_argument(
7071
"filename", type=str, default=":memory:", nargs="?",

Lib/tarfile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2883,7 +2883,7 @@ def main():
28832883
import argparse
28842884

28852885
description = 'A simple command-line interface for tarfile module.'
2886-
parser = argparse.ArgumentParser(description=description)
2886+
parser = argparse.ArgumentParser(description=description, color=True)
28872887
parser.add_argument('-v', '--verbose', action='store_true', default=False,
28882888
help='Verbose output')
28892889
parser.add_argument('--filter', metavar='<filtername>',

Lib/test/test_ast/test_ast.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3289,6 +3289,7 @@ def f(x: int) -> int:
32893289
with self.subTest(flags=args):
32903290
self.invoke_ast(*args)
32913291

3292+
@support.force_not_colorized
32923293
def test_help_message(self):
32933294
for flag in ('-h', '--help', '--unknown'):
32943295
with self.subTest(flag=flag):

Lib/test/test_calendar.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -987,6 +987,7 @@ def assertFailure(self, *args):
987987
self.assertCLIFails(*args)
988988
self.assertCmdFails(*args)
989989

990+
@support.force_not_colorized
990991
def test_help(self):
991992
stdout = self.run_cmd_ok('-h')
992993
self.assertIn(b'usage:', stdout)

Lib/test/test_mimetypes.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import unittest.mock
77
from platform import win32_edition
88
from test import support
9-
from test.support import os_helper
9+
from test.support import force_not_colorized, os_helper
1010

1111
try:
1212
import _winapi
@@ -437,6 +437,7 @@ def test__all__(self):
437437

438438

439439
class CommandLineTest(unittest.TestCase):
440+
@force_not_colorized
440441
def test_parse_args(self):
441442
args, help_text = mimetypes._parse_args("-h")
442443
self.assertTrue(help_text.startswith("usage: "))

Lib/test/test_pickle.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,7 @@ def test_invocation(self):
745745
expect = self.text_normalize(expect)
746746
self.assertListEqual(res.splitlines(), expect.splitlines())
747747

748+
@support.force_not_colorized
748749
def test_unknown_flag(self):
749750
stderr = io.StringIO()
750751
with self.assertRaises(SystemExit):

Lib/test/test_platform.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,7 @@ def test_arg_parsing(self):
794794
self.invoke_platform(*flags)
795795
obj.assert_called_once_with(aliased, terse)
796796

797+
@support.force_not_colorized
797798
def test_help(self):
798799
output = io.StringIO()
799800

Lib/test/test_random.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1411,6 +1411,7 @@ def test_after_fork(self):
14111411

14121412

14131413
class CommandLineTest(unittest.TestCase):
1414+
@support.force_not_colorized
14141415
def test_parse_args(self):
14151416
args, help_text = random._parse_args(shlex.split("--choice a b c"))
14161417
self.assertEqual(args.choice, ["a", "b", "c"])

Lib/test/test_sqlite3/test_cli.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@
44

55
from sqlite3.__main__ import main as cli
66
from test.support.os_helper import TESTFN, unlink
7-
from test.support import captured_stdout, captured_stderr, captured_stdin
7+
from test.support import (
8+
captured_stdout,
9+
captured_stderr,
10+
captured_stdin,
11+
force_not_colorized,
12+
)
813

914

1015
class CommandLineInterface(unittest.TestCase):
@@ -32,6 +37,7 @@ def expect_failure(self, *args):
3237
self.assertEqual(out, "")
3338
return err
3439

40+
@force_not_colorized
3541
def test_cli_help(self):
3642
out = self.expect_success("-h")
3743
self.assertIn("usage: ", out)

Lib/tokenize.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ def error(message, filename=None, location=None):
518518
sys.exit(1)
519519

520520
# Parse the arguments and options
521-
parser = argparse.ArgumentParser()
521+
parser = argparse.ArgumentParser(color=True)
522522
parser.add_argument(dest='filename', nargs='?',
523523
metavar='filename.py',
524524
help='the file to tokenize; defaults to stdin')

Lib/trace.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -604,7 +604,7 @@ def results(self):
604604
def main():
605605
import argparse
606606

607-
parser = argparse.ArgumentParser()
607+
parser = argparse.ArgumentParser(color=True)
608608
parser.add_argument('--version', action='version', version='trace 2.0')
609609

610610
grp = parser.add_argument_group('Main options',

Lib/unittest/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ def _getParentArgParser(self):
197197
return parser
198198

199199
def _getMainArgParser(self, parent):
200-
parser = argparse.ArgumentParser(parents=[parent])
200+
parser = argparse.ArgumentParser(parents=[parent], color=True)
201201
parser.prog = self.progName
202202
parser.print_help = self._print_help
203203

@@ -208,7 +208,7 @@ def _getMainArgParser(self, parent):
208208
return parser
209209

210210
def _getDiscoveryArgParser(self, parent):
211-
parser = argparse.ArgumentParser(parents=[parent])
211+
parser = argparse.ArgumentParser(parents=[parent], color=True)
212212
parser.prog = '%s discover' % self.progName
213213
parser.epilog = ('For test discovery all test modules must be '
214214
'importable from the top level directory of the '

Lib/uuid.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -949,7 +949,9 @@ def main():
949949
import argparse
950950
parser = argparse.ArgumentParser(
951951
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
952-
description="Generate a UUID using the selected UUID function.")
952+
description="Generate a UUID using the selected UUID function.",
953+
color=True,
954+
)
953955
parser.add_argument("-u", "--uuid",
954956
choices=uuid_funcs.keys(),
955957
default="uuid4",

Lib/venv/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,9 @@ def main(args=None):
624624
'created, you may wish to '
625625
'activate it, e.g. by '
626626
'sourcing an activate script '
627-
'in its bin directory.')
627+
'in its bin directory.',
628+
color=True,
629+
)
628630
parser.add_argument('dirs', metavar='ENV_DIR', nargs='+',
629631
help='A directory to create the environment in.')
630632
parser.add_argument('--system-site-packages', default=False,

Lib/webbrowser.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -719,7 +719,9 @@ def open(self, url, new=0, autoraise=True):
719719

720720
def parse_args(arg_list: list[str] | None):
721721
import argparse
722-
parser = argparse.ArgumentParser(description="Open URL in a web browser.")
722+
parser = argparse.ArgumentParser(
723+
description="Open URL in a web browser.", color=True,
724+
)
723725
parser.add_argument("url", help="URL to open")
724726

725727
group = parser.add_mutually_exclusive_group()

Lib/zipapp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ def main(args=None):
187187
"""
188188
import argparse
189189

190-
parser = argparse.ArgumentParser()
190+
parser = argparse.ArgumentParser(color=True)
191191
parser.add_argument('--output', '-o', default=None,
192192
help="The name of the output archive. "
193193
"Required if SOURCE is an archive.")

Lib/zipfile/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2317,7 +2317,7 @@ def main(args=None):
23172317
import argparse
23182318

23192319
description = 'A simple command-line interface for zipfile module.'
2320-
parser = argparse.ArgumentParser(description=description)
2320+
parser = argparse.ArgumentParser(description=description, color=True)
23212321
group = parser.add_mutually_exclusive_group(required=True)
23222322
group.add_argument('-l', '--list', metavar='<zipfile>',
23232323
help='Show listing of a zipfile')
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add color to stdlib argparse CLIs. Patch by Hugo van Kemenade.

0 commit comments

Comments
 (0)