mirror of
https://github.com/python/cpython.git
synced 2025-12-23 09:19:18 +00:00
GH-142389: Add backtick markup support in description and epilog (#142390)
Some checks failed
Tests / Change detection (push) Waiting to run
Tests / Docs (push) Blocked by required conditions
Tests / Check if Autoconf files are up to date (push) Blocked by required conditions
Tests / Check if generated files are up to date (push) Blocked by required conditions
Tests / (push) Blocked by required conditions
Tests / Windows MSI (push) Blocked by required conditions
Tests / Ubuntu SSL tests with OpenSSL (push) Blocked by required conditions
Tests / Ubuntu SSL tests with AWS-LC (push) Blocked by required conditions
Tests / Android (aarch64) (push) Blocked by required conditions
Tests / Android (x86_64) (push) Blocked by required conditions
Tests / iOS (push) Blocked by required conditions
Tests / WASI (push) Blocked by required conditions
Tests / Hypothesis tests on Ubuntu (push) Blocked by required conditions
Tests / Address sanitizer (push) Blocked by required conditions
Tests / Sanitizers (push) Blocked by required conditions
Tests / Cross build Linux (push) Blocked by required conditions
Tests / CIFuzz (push) Blocked by required conditions
Tests / All required checks pass (push) Blocked by required conditions
Lint / lint (push) Waiting to run
mypy / Run mypy on Lib/_pyrepl (push) Waiting to run
mypy / Run mypy on Lib/test/libregrtest (push) Waiting to run
mypy / Run mypy on Lib/tomllib (push) Waiting to run
mypy / Run mypy on Tools/build (push) Waiting to run
mypy / Run mypy on Tools/cases_generator (push) Waiting to run
mypy / Run mypy on Tools/clinic (push) Waiting to run
mypy / Run mypy on Tools/jit (push) Waiting to run
mypy / Run mypy on Tools/peg_generator (push) Waiting to run
JIT / Interpreter (Debug) (push) Has been cancelled
Tail calling interpreter / aarch64-apple-darwin/clang (push) Has been cancelled
Tail calling interpreter / aarch64-unknown-linux-gnu/gcc (push) Has been cancelled
Tail calling interpreter / x86_64-pc-windows-msvc/msvc (push) Has been cancelled
Tail calling interpreter / x86_64-apple-darwin/clang (push) Has been cancelled
Tail calling interpreter / free-threading (push) Has been cancelled
Tail calling interpreter / x86_64-unknown-linux-gnu/gcc (push) Has been cancelled
JIT / aarch64-pc-windows-msvc/msvc (Release) (push) Has been cancelled
JIT / aarch64-pc-windows-msvc/msvc (Debug) (push) Has been cancelled
JIT / i686-pc-windows-msvc/msvc (Release) (push) Has been cancelled
JIT / i686-pc-windows-msvc/msvc (Debug) (push) Has been cancelled
JIT / aarch64-apple-darwin/clang (Release) (push) Has been cancelled
JIT / aarch64-unknown-linux-gnu/gcc (Release) (push) Has been cancelled
JIT / aarch64-apple-darwin/clang (Debug) (push) Has been cancelled
JIT / aarch64-unknown-linux-gnu/gcc (Debug) (push) Has been cancelled
JIT / x86_64-pc-windows-msvc/msvc (Release) (push) Has been cancelled
JIT / x86_64-pc-windows-msvc/msvc (Debug) (push) Has been cancelled
JIT / x86_64-apple-darwin/clang (Release) (push) Has been cancelled
JIT / x86_64-unknown-linux-gnu/gcc (Release) (push) Has been cancelled
JIT / x86_64-apple-darwin/clang (Debug) (push) Has been cancelled
JIT / x86_64-unknown-linux-gnu/gcc (Debug) (push) Has been cancelled
JIT / Free-Threaded (Debug) (push) Has been cancelled
JIT / JIT without optimizations (Debug) (push) Has been cancelled
JIT / JIT with tail calling interpreter (push) Has been cancelled
Some checks failed
Tests / Change detection (push) Waiting to run
Tests / Docs (push) Blocked by required conditions
Tests / Check if Autoconf files are up to date (push) Blocked by required conditions
Tests / Check if generated files are up to date (push) Blocked by required conditions
Tests / (push) Blocked by required conditions
Tests / Windows MSI (push) Blocked by required conditions
Tests / Ubuntu SSL tests with OpenSSL (push) Blocked by required conditions
Tests / Ubuntu SSL tests with AWS-LC (push) Blocked by required conditions
Tests / Android (aarch64) (push) Blocked by required conditions
Tests / Android (x86_64) (push) Blocked by required conditions
Tests / iOS (push) Blocked by required conditions
Tests / WASI (push) Blocked by required conditions
Tests / Hypothesis tests on Ubuntu (push) Blocked by required conditions
Tests / Address sanitizer (push) Blocked by required conditions
Tests / Sanitizers (push) Blocked by required conditions
Tests / Cross build Linux (push) Blocked by required conditions
Tests / CIFuzz (push) Blocked by required conditions
Tests / All required checks pass (push) Blocked by required conditions
Lint / lint (push) Waiting to run
mypy / Run mypy on Lib/_pyrepl (push) Waiting to run
mypy / Run mypy on Lib/test/libregrtest (push) Waiting to run
mypy / Run mypy on Lib/tomllib (push) Waiting to run
mypy / Run mypy on Tools/build (push) Waiting to run
mypy / Run mypy on Tools/cases_generator (push) Waiting to run
mypy / Run mypy on Tools/clinic (push) Waiting to run
mypy / Run mypy on Tools/jit (push) Waiting to run
mypy / Run mypy on Tools/peg_generator (push) Waiting to run
JIT / Interpreter (Debug) (push) Has been cancelled
Tail calling interpreter / aarch64-apple-darwin/clang (push) Has been cancelled
Tail calling interpreter / aarch64-unknown-linux-gnu/gcc (push) Has been cancelled
Tail calling interpreter / x86_64-pc-windows-msvc/msvc (push) Has been cancelled
Tail calling interpreter / x86_64-apple-darwin/clang (push) Has been cancelled
Tail calling interpreter / free-threading (push) Has been cancelled
Tail calling interpreter / x86_64-unknown-linux-gnu/gcc (push) Has been cancelled
JIT / aarch64-pc-windows-msvc/msvc (Release) (push) Has been cancelled
JIT / aarch64-pc-windows-msvc/msvc (Debug) (push) Has been cancelled
JIT / i686-pc-windows-msvc/msvc (Release) (push) Has been cancelled
JIT / i686-pc-windows-msvc/msvc (Debug) (push) Has been cancelled
JIT / aarch64-apple-darwin/clang (Release) (push) Has been cancelled
JIT / aarch64-unknown-linux-gnu/gcc (Release) (push) Has been cancelled
JIT / aarch64-apple-darwin/clang (Debug) (push) Has been cancelled
JIT / aarch64-unknown-linux-gnu/gcc (Debug) (push) Has been cancelled
JIT / x86_64-pc-windows-msvc/msvc (Release) (push) Has been cancelled
JIT / x86_64-pc-windows-msvc/msvc (Debug) (push) Has been cancelled
JIT / x86_64-apple-darwin/clang (Release) (push) Has been cancelled
JIT / x86_64-unknown-linux-gnu/gcc (Release) (push) Has been cancelled
JIT / x86_64-apple-darwin/clang (Debug) (push) Has been cancelled
JIT / x86_64-unknown-linux-gnu/gcc (Debug) (push) Has been cancelled
JIT / Free-Threaded (Debug) (push) Has been cancelled
JIT / JIT without optimizations (Debug) (push) Has been cancelled
JIT / JIT with tail calling interpreter (push) Has been cancelled
This commit is contained in:
parent
fa1ac9070c
commit
8b669d54c3
5 changed files with 142 additions and 1 deletions
|
|
@ -645,6 +645,27 @@ are set.
|
|||
|
||||
.. versionadded:: 3.14
|
||||
|
||||
To highlight inline code in your description or epilog text, you can use
|
||||
backticks::
|
||||
|
||||
>>> parser = argparse.ArgumentParser(
|
||||
... formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
... epilog='''Examples:
|
||||
... `python -m myapp --verbose`
|
||||
... `python -m myapp --config settings.json`
|
||||
... ''')
|
||||
|
||||
When colors are enabled, the text inside backticks will be displayed in a
|
||||
distinct color to help examples stand out. When colors are disabled, backticks
|
||||
are preserved as-is, which is readable in plain text.
|
||||
|
||||
.. note::
|
||||
|
||||
Backtick markup only applies to description and epilog text. It does not
|
||||
apply to individual argument ``help`` strings.
|
||||
|
||||
.. versionadded:: 3.15
|
||||
|
||||
|
||||
The add_argument() method
|
||||
-------------------------
|
||||
|
|
|
|||
|
|
@ -423,6 +423,10 @@ argparse
|
|||
default to ``True``. This enables suggestions for mistyped arguments by default.
|
||||
(Contributed by Jakob Schluse in :gh:`140450`.)
|
||||
|
||||
* Added backtick markup support in description and epilog text to highlight
|
||||
inline code when color output is enabled.
|
||||
(Contributed by Savannah Ostrowski in :gh:`142390`.)
|
||||
|
||||
calendar
|
||||
--------
|
||||
|
||||
|
|
|
|||
|
|
@ -517,7 +517,27 @@ class HelpFormatter(object):
|
|||
text = text % dict(prog=self._prog)
|
||||
text_width = max(self._width - self._current_indent, 11)
|
||||
indent = ' ' * self._current_indent
|
||||
return self._fill_text(text, text_width, indent) + '\n\n'
|
||||
text = self._fill_text(text, text_width, indent)
|
||||
text = self._apply_text_markup(text)
|
||||
return text + '\n\n'
|
||||
|
||||
def _apply_text_markup(self, text):
|
||||
"""Apply color markup to text.
|
||||
|
||||
Supported markup:
|
||||
`...` - inline code (rendered with prog_extra color)
|
||||
|
||||
When colors are disabled, backticks are preserved as-is.
|
||||
"""
|
||||
t = self._theme
|
||||
if not t.reset:
|
||||
return text
|
||||
text = _re.sub(
|
||||
r'`([^`]+)`',
|
||||
rf'{t.prog_extra}\1{t.reset}',
|
||||
text,
|
||||
)
|
||||
return text
|
||||
|
||||
def _format_action(self, action):
|
||||
# determine the required width and the entry label
|
||||
|
|
|
|||
|
|
@ -7568,6 +7568,101 @@ class TestColorized(TestCase):
|
|||
self.assertNotIn('\x1b[', warn)
|
||||
self.assertIn('warning:', warn)
|
||||
|
||||
def test_backtick_markup_in_epilog(self):
|
||||
parser = argparse.ArgumentParser(
|
||||
prog='PROG',
|
||||
color=True,
|
||||
epilog='Example: `python -m myapp --verbose`',
|
||||
)
|
||||
|
||||
prog_extra = self.theme.prog_extra
|
||||
reset = self.theme.reset
|
||||
|
||||
help_text = parser.format_help()
|
||||
self.assertIn(f'Example: {prog_extra}python -m myapp --verbose{reset}',
|
||||
help_text)
|
||||
self.assertNotIn('`', help_text)
|
||||
|
||||
def test_backtick_markup_in_description(self):
|
||||
parser = argparse.ArgumentParser(
|
||||
prog='PROG',
|
||||
color=True,
|
||||
description='Run `python -m myapp` to start.',
|
||||
)
|
||||
|
||||
prog_extra = self.theme.prog_extra
|
||||
reset = self.theme.reset
|
||||
|
||||
help_text = parser.format_help()
|
||||
self.assertIn(f'Run {prog_extra}python -m myapp{reset} to start.',
|
||||
help_text)
|
||||
|
||||
def test_backtick_markup_multiple(self):
|
||||
parser = argparse.ArgumentParser(
|
||||
prog='PROG',
|
||||
color=True,
|
||||
epilog='Try `app run` or `app test`.',
|
||||
)
|
||||
|
||||
prog_extra = self.theme.prog_extra
|
||||
reset = self.theme.reset
|
||||
|
||||
help_text = parser.format_help()
|
||||
self.assertIn(f'{prog_extra}app run{reset}', help_text)
|
||||
self.assertIn(f'{prog_extra}app test{reset}', help_text)
|
||||
|
||||
def test_backtick_markup_not_applied_when_color_disabled(self):
|
||||
# When color is disabled, backticks are preserved as-is
|
||||
parser = argparse.ArgumentParser(
|
||||
prog='PROG',
|
||||
color=False,
|
||||
epilog='Example: `python -m myapp`',
|
||||
)
|
||||
|
||||
help_text = parser.format_help()
|
||||
self.assertIn('`python -m myapp`', help_text)
|
||||
self.assertNotIn('\x1b[', help_text)
|
||||
|
||||
def test_backtick_markup_with_format_string(self):
|
||||
parser = argparse.ArgumentParser(
|
||||
prog='myapp',
|
||||
color=True,
|
||||
epilog='Run `%(prog)s --help` for more info.',
|
||||
)
|
||||
|
||||
prog_extra = self.theme.prog_extra
|
||||
reset = self.theme.reset
|
||||
|
||||
help_text = parser.format_help()
|
||||
self.assertIn(f'{prog_extra}myapp --help{reset}', help_text)
|
||||
|
||||
def test_backtick_markup_in_subparser(self):
|
||||
parser = argparse.ArgumentParser(prog='PROG', color=True)
|
||||
subparsers = parser.add_subparsers()
|
||||
sub = subparsers.add_parser(
|
||||
'sub',
|
||||
description='Run `PROG sub --foo` to start.',
|
||||
)
|
||||
|
||||
prog_extra = self.theme.prog_extra
|
||||
reset = self.theme.reset
|
||||
|
||||
help_text = sub.format_help()
|
||||
self.assertIn(f'{prog_extra}PROG sub --foo{reset}', help_text)
|
||||
|
||||
def test_backtick_markup_special_regex_chars(self):
|
||||
parser = argparse.ArgumentParser(
|
||||
prog='PROG',
|
||||
color=True,
|
||||
epilog='`grep "foo.*bar" | sort`',
|
||||
)
|
||||
|
||||
prog_extra = self.theme.prog_extra
|
||||
reset = self.theme.reset
|
||||
|
||||
help_text = parser.format_help()
|
||||
self.assertIn(f'{prog_extra}grep "foo.*bar" | sort{reset}', help_text)
|
||||
|
||||
def test_print_help_uses_target_file_for_color_decision(self):
|
||||
parser = argparse.ArgumentParser(prog='PROG', color=True)
|
||||
parser.add_argument('--opt')
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
Add backtick markup support in :mod:`argparse` description and epilog text to highlight inline code when color output is enabled.
|
||||
Loading…
Add table
Add a link
Reference in a new issue