Skip to content

Commit 6d644e4

Browse files
alexprengereblurb-it[bot]savannahostrowski
authored
gh-141939: Add colors to interpolated values in argparse (#141940)
Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Savannah Ostrowski <[email protected]>
1 parent 15313dd commit 6d644e4

File tree

4 files changed

+26
-13
lines changed

4 files changed

+26
-13
lines changed

Lib/_colorize.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ class Argparse(ThemeSection):
169169
label: str = ANSIColors.BOLD_YELLOW
170170
action: str = ANSIColors.BOLD_GREEN
171171
default: str = ANSIColors.GREY
172-
default_value: str = ANSIColors.YELLOW
172+
interpolated_value: str = ANSIColors.YELLOW
173173
reset: str = ANSIColors.RESET
174174
error: str = ANSIColors.BOLD_MAGENTA
175175
warning: str = ANSIColors.BOLD_YELLOW

Lib/argparse.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,10 @@ def _expand_help(self, action):
668668
params[name] = value.__name__
669669
if params.get('choices') is not None:
670670
params['choices'] = ', '.join(map(str, params['choices']))
671+
# Before interpolating, wrap the values with color codes
672+
t = self._theme
673+
for name, value in params.items():
674+
params[name] = f"{t.interpolated_value}{value}{t.reset}"
671675
return help_string % params
672676

673677
def _iter_indented_subactions(self, action):
@@ -749,8 +753,8 @@ def _get_help_string(self, action):
749753
default_str = _(" (default: %(default)s)")
750754
prefix, suffix = default_str.split("%(default)s")
751755
help += (
752-
f" {t.default}{prefix.lstrip()}"
753-
f"{t.default_value}%(default)s"
756+
f" {t.default}{prefix.lstrip()}{t.reset}"
757+
f"%(default)s"
754758
f"{t.default}{suffix}{t.reset}"
755759
)
756760
return help

Lib/test/test_argparse.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7308,6 +7308,13 @@ def test_argparse_color(self):
73087308
choices=("Aaaaa", "Bbbbb", "Ccccc", "Ddddd"),
73097309
help="pick one",
73107310
)
7311+
parser.add_argument(
7312+
"--optional8",
7313+
default="A",
7314+
metavar="X",
7315+
choices=("A", "B", "C"),
7316+
help="among %(choices)s, default is %(default)s",
7317+
)
73117318

73127319
parser.add_argument("+f")
73137320
parser.add_argument("++bar")
@@ -7334,7 +7341,7 @@ def test_argparse_color(self):
73347341
label_b = self.theme.label
73357342
pos_b = self.theme.action
73367343
default = self.theme.default
7337-
default_value = self.theme.default_value
7344+
interp = self.theme.interpolated_value
73387345
reset = self.theme.reset
73397346

73407347
# Act
@@ -7347,8 +7354,8 @@ def test_argparse_color(self):
73477354
f"""\
73487355
{heading}usage: {reset}{prog}PROG{reset} [{short}-h{reset}] [{short}-v{reset} | {short}-q{reset}] [{short}-o{reset}] [{long}--optional2 {label}OPTIONAL2{reset}] [{long}--optional3 {label}{{X,Y,Z}}{reset}]
73497356
[{long}--optional4 {label}{{X,Y,Z}}{reset}] [{long}--optional5 {label}{{X,Y,Z}}{reset}] [{long}--optional6 {label}{{X,Y,Z}}{reset}]
7350-
[{short}-p {label}{{Aaaaa,Bbbbb,Ccccc,Ddddd}}{reset}] [{short}+f {label}F{reset}] [{long}++bar {label}BAR{reset}] [{long}-+baz {label}BAZ{reset}]
7351-
[{short}-c {label}COUNT{reset}]
7357+
[{short}-p {label}{{Aaaaa,Bbbbb,Ccccc,Ddddd}}{reset}] [{long}--optional8 {label}X{reset}] [{short}+f {label}F{reset}] [{long}++bar {label}BAR{reset}]
7358+
[{long}-+baz {label}BAZ{reset}] [{short}-c {label}COUNT{reset}]
73527359
{pos}x{reset} {pos}y{reset} {pos}this_indeed_is_a_very_long_action_name{reset} {pos}{{sub1,sub2}} ...{reset}
73537360
73547361
Colorful help
@@ -7361,17 +7368,18 @@ def test_argparse_color(self):
73617368
73627369
{heading}options:{reset}
73637370
{short_b}-h{reset}, {long_b}--help{reset} show this help message and exit
7364-
{short_b}-v{reset}, {long_b}--verbose{reset} more spam {default}(default: {default_value}False{default}){reset}
7365-
{short_b}-q{reset}, {long_b}--quiet{reset} less spam {default}(default: {default_value}False{default}){reset}
7371+
{short_b}-v{reset}, {long_b}--verbose{reset} more spam {default}(default: {reset}{interp}False{reset}{default}){reset}
7372+
{short_b}-q{reset}, {long_b}--quiet{reset} less spam {default}(default: {reset}{interp}False{reset}{default}){reset}
73667373
{short_b}-o{reset}, {long_b}--optional1{reset}
73677374
{long_b}--optional2{reset} {label_b}OPTIONAL2{reset}
7368-
pick one {default}(default: {default_value}None{default}){reset}
7375+
pick one {default}(default: {reset}{interp}None{reset}{default}){reset}
73697376
{long_b}--optional3{reset} {label_b}{{X,Y,Z}}{reset}
7370-
{long_b}--optional4{reset} {label_b}{{X,Y,Z}}{reset} pick one {default}(default: {default_value}None{default}){reset}
7371-
{long_b}--optional5{reset} {label_b}{{X,Y,Z}}{reset} pick one {default}(default: {default_value}None{default}){reset}
7372-
{long_b}--optional6{reset} {label_b}{{X,Y,Z}}{reset} pick one {default}(default: {default_value}None{default}){reset}
7377+
{long_b}--optional4{reset} {label_b}{{X,Y,Z}}{reset} pick one {default}(default: {reset}{interp}None{reset}{default}){reset}
7378+
{long_b}--optional5{reset} {label_b}{{X,Y,Z}}{reset} pick one {default}(default: {reset}{interp}None{reset}{default}){reset}
7379+
{long_b}--optional6{reset} {label_b}{{X,Y,Z}}{reset} pick one {default}(default: {reset}{interp}None{reset}{default}){reset}
73737380
{short_b}-p{reset}, {long_b}--optional7{reset} {label_b}{{Aaaaa,Bbbbb,Ccccc,Ddddd}}{reset}
7374-
pick one {default}(default: {default_value}None{default}){reset}
7381+
pick one {default}(default: {reset}{interp}None{reset}{default}){reset}
7382+
{long_b}--optional8{reset} {label_b}X{reset} among {interp}A, B, C{reset}, default is {interp}A{reset}
73757383
{short_b}+f{reset} {label_b}F{reset}
73767384
{long_b}++bar{reset} {label_b}BAR{reset}
73777385
{long_b}-+baz{reset} {label_b}BAZ{reset}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add color to all interpolated values in :mod:`argparse` help, like ``%(default)s`` or ``%(choices)s``. Patch by Alex Prengère.

0 commit comments

Comments
 (0)