click_extra.sphinx package¶
Helpers and utilities for Sphinx.
Note
The MkDocs counterpart lives in click_extra.mkdocs, which achieves the same
ANSI color rendering by patching pymdownx.highlight’s formatter classes.
- click_extra.sphinx.EXEC_DIRECTIVES_OPT_IN = 'click_extra_enable_exec_directives'¶
Name of the
conf.pyconfig flag that gates every code-execution directive.Default is
False. A project that addsclick_extra.sphinxto itsextensionslist gets the ANSI Pygments formatter and the GitHub-alerts converter unconditionally, but does not gain access to either theclick:*or thepython:*directive families until the maintainer opts in explicitly. Both familiesexecuser-supplied Python at build time with full Sphinx-process privileges; gating them behind a single explicit flag keeps a transitive import or a doc-only pull request from silently expanding the build’s attack surface.
- click_extra.sphinx.setup(app)[source]¶
Register extensions to Sphinx.
Always-on features (no execution surface):
The ANSI-capable HTML formatter for Pygments (replaces
sphinx.highlighting.PygmentsBridgewith one that renders ANSI colors in code blocks).GitHub-flavored alert syntax (
> [!NOTE], etc.) in included and regular source files, converted to MyST/reST admonitions.
Opt-in features (gated behind
click_extra_enable_exec_directives):click:source/click:runto define and execute Click CLIs at build time.python:source/python:runto execute arbitrary Python at build time and render its source or capturedstdout.python:render/python:render-myst/python:render-rstto execute arbitrary Python and parse the capturedstdoutas live document content.
All directives in the opt-in group execute user-supplied Python with the same privileges as the Sphinx process. They are therefore disabled by default. Set
click_extra_enable_exec_directives = Trueinconf.pyto register them.Caution
This function forces the Sphinx app to use
sphinx.highlighting.PygmentsBridgeinstead of the default HTML formatter to add support for ANSI colors in code blocks.- Return type:
ExtensionMetadata
Submodules¶
click_extra.sphinx.alerts module¶
Utilities to convert GitHub alerts into MyST admonitions for Sphinx.
See also
GitHub documentation for `alerts syntax
<https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts>`_. - Announcement for alert support starting 2023-12-14.
- click_extra.sphinx.alerts.GITHUB_ALERT_PATTERN = re.compile('^\\s*\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\\s*$')¶
Regex pattern to match GitHub alert type declaration (without leading >).
- click_extra.sphinx.alerts.QUOTE_PREFIX_PATTERN = re.compile('^(\\s*)((?:>\\s*)+)(.*)$')¶
Regex pattern to extract indent, quote markers, and content.
- click_extra.sphinx.alerts.CODE_FENCE_PATTERN = re.compile('^(\\s*)(`{3,}|~{3,})(.*)$')¶
Regex pattern to match code fence opening/closing lines.
- click_extra.sphinx.alerts.INDENTED_CODE_BLOCK_PATTERN = re.compile('^( {4}|\\t)')¶
Regex pattern to match indented code block lines (4 spaces or 1 tab).
- class click_extra.sphinx.alerts.Alert(alert_type, indent, depth, has_nested=False, opening_line_index=0)[source]¶
Bases:
objectRepresents a GitHub alert being processed.
- class click_extra.sphinx.alerts.FenceState(char, length, indent, is_code_block)[source]¶
Bases:
objectTracks code fence state.
- class click_extra.sphinx.alerts.ParserState(result=<factory>, alert_stack=<factory>, fence_stack=<factory>, prev_line_blank=True, modified=False, just_opened_fence_directive=False)[source]¶
Bases:
objectMutable state for the alert parser.
- fence_stack: list[FenceState]¶
- click_extra.sphinx.alerts.check_colon_fence(app: Sphinx) None[source]¶
Check that colon_fence support is enabled for MyST.
- Raises:
ConfigError – If
colon_fenceis not inmyst_enable_extensions.- Return type:
- click_extra.sphinx.alerts.count_quote_depth(line)[source]¶
Parse a line to extract indent, quote depth, and content.
- Returns:
Tuple of (indent, depth, content) where depth is the number of > markers.
- click_extra.sphinx.alerts.process_fence(state, indent, chars, after)[source]¶
Process a fence line, updating fence stack.
- Return type:
- click_extra.sphinx.alerts.close_alerts_to_depth(state, target_depth)[source]¶
Close all alerts deeper than target_depth.
- Return type:
- click_extra.sphinx.alerts.mark_parent_nested(state)[source]¶
Mark the parent alert as having a nested alert and update its opening.
- Return type:
- click_extra.sphinx.alerts.open_alert(state, alert_type, indent, depth)[source]¶
Open a new alert at the given depth.
- Return type:
- click_extra.sphinx.alerts.process_quoted_line(state, line)[source]¶
Process a line that starts with quote markers.
Returns True if the line was handled as part of an alert.
- Return type:
click_extra.sphinx.click module¶
Sphinx rendering of CLI based on Click Extra.
See also
These directives are based on Pallets’ Sphinx Themes, released under a BSD-3-Clause license.
Compared to the latter, it:
Add support for MyST syntax.
Adds rendering of ANSI codes in CLI results.
Has better error handling and reporting which helps you pinpoint the failing code in your documentation.
Removes the
printlnfunction which was used to explicitly print a blank line. This is no longer needed as it is now handled natively.
- click_extra.sphinx.click.RST_INDENT = ' '¶
The indentation used for rST code blocks lines.
- class click_extra.sphinx.click.TerminatedEchoingStdin(input, output)[source]¶
Bases:
EchoingStdinLike
click.testing.EchoingStdinbut adds a visible^Din place of the EOT character ().ClickRunner.invoke()addswhenterminate_input=True.
- click_extra.sphinx.click.patch_subprocess()[source]¶
Patch subprocess to work better with
ClickRunner.invoke().subprocess.calloutput is redirected toclick.echoso it shows up in the example output.Caution
The replacement is installed on the
subprocessmodule itself (not thread-local), so for the duration of thewithblock any other code in the same process that callssubprocess.callsees the patched version. Withparallel_read_safe = Truedeclared onClickDomain, a parallel reader running concurrently on a different document gets the patchedsubprocess.calltoo. The redirection is benign (output goes toclick.echo) but the race is real, and the parallel-safe claim is weaker than it looks for documents that themselves shell out viasubprocess.call.
- class click_extra.sphinx.click.ClickRunner[source]¶
Bases:
CliRunnerA sub-class of
click.testing.CliRunnerfor Sphinx directive execution.Produces unfiltered ANSI codes so that the
Directivesub-classes below can render colors in the HTML output.- isolation(*args, **kwargs)[source]¶
A context manager that sets up the isolation for invoking of a command line tool. This sets up <stdin> with the given input data and os.environ with the overrides from the given dictionary. This also rebinds some internals in Click to be mocked (like the prompt functionality).
This is automatically done in the
invoke()method.- Parameters:
input – the input stream to put into sys.stdin.
env – the environment overrides as dictionary.
color – whether the output should contain color codes. The application can still override this explicitly.
Added in version 8.2: An additional output stream is returned, which is a mix of <stdout> and <stderr> streams.
Changed in version 8.2: Always returns the <stderr> stream.
Changed in version 8.0: <stderr> is opened with
errors="backslashreplace"instead of the default"strict".Changed in version 4.0: Added the
colorparameter.
- invoke(cli, args=None, prog_name=None, input=None, terminate_input=False, env=None, _output_lines=None, **extra)[source]¶
Like
CliRunner.invoke()but displays what the user would enter in the terminal for env vars, command arguments, and prompts.- Parameters:
terminate_input – Whether to display
^Dafter a list of input._output_lines – A list used internally to collect lines to be displayed.
- Return type:
- execute_source(directive)[source]¶
Execute the given code, adding it to the runner’s namespace.
- Return type:
- run_cli(directive)[source]¶
Execute the given
source_code.Returns a simulation of terminal execution, including a mix of input, output, prompts and tracebacks.
The execution context is augmented, so you can refer directly to these functions in the provided
source_code:invoke(): which is the same asClickRunner.invoke()isolated_filesystem(): A context manager that changes to a temporary directory while executing the block.
If any local variable in the provided
source_codeconflicts with these functions, aRuntimeErroris raised to help you pinpoint the issue.
- class click_extra.sphinx.click.ClickDirective(name, arguments, options, content, lineno, content_offset, block_text, state, state_machine)[source]¶
Bases:
SphinxDirective- has_content = True¶
May the directive have content?
- required_arguments = 0¶
Number of required directive arguments.
- optional_arguments = 1¶
The optional argument overrides the default Pygments language to use.
- final_argument_whitespace = False¶
May the final argument contain whitespace?
- option_spec: ClassVar[OptionSpec] = {'caption': <function unchanged_required>, 'class': <function class_option>, 'dedent': <function optional_int>, 'emphasize-lines': <function unchanged_required>, 'emphasize-result-lines': <function unchanged_required>, 'force': <function flag>, 'hide-results': <function flag>, 'hide-source': <function flag>, 'language': <function unchanged_required>, 'lineno-start': <class 'int'>, 'linenos': <function flag>, 'name': <function unchanged>, 'show-results': <function flag>, 'show-source': <function flag>}¶
Options supported by this directive.
Support the same options as
sphinx.directives.code.CodeBlock, and some specific to Click directives.The standard
emphasize-linesoption applies to the source block only. Useemphasize-result-linesto highlight specific lines in the captured output block, with the same syntax (e.g.:emphasize-result-lines: 1,3-5).
- default_language: str¶
Default highlighting language to use to render the code block.
All Pygments’ languages short names are recognized.
- show_source_by_default: bool = True¶
Whether to render the source code of the example in the code block.
- show_results_by_default: bool = True¶
Whether to render the results of the example in the code block.
- runner_method: str¶
The name of the method to call on the
ClickRunnerinstance.
- runner_attr: ClassVar[str] = 'click_runner'¶
Name of the attribute holding the runner on the doctree.
Subclasses (like
PythonDirective) override this so the Click and Python runners don’t collide on the same document.
- runner_factory¶
Class to instantiate for the per-document runner.
Defaults to
ClickRunnerinClickDirective(set after the class definition to break the forward reference).alias of
ClickRunner
- property runner¶
Get or create the per-document runner.
Creates one runner per document, keyed by
runner_attr.
- property language: str[source]¶
Short name of the Pygments lexer used to highlight the code block.
Returns, in order of precedence, the language specified in the :language: directive options, the first argument of the directive (if any), or the default set in the directive class.
- code_block_options(target='source')[source]¶
Render the options supported by Sphinx’ native
code-blockdirective.targetselects which block these options will be attached to:"source"for the directive’s input source code,"results"for the captured output.emphasize-linesroutes to the source block;emphasize-result-linesis rewritten asemphasize-lineson the results block, so authors can highlight different lines in each.
- property show_source: bool[source]¶
Whether to show the source code of the example in the code block.
The last occurrence of either
show-sourceorhide-sourceoptions wins. If neither is set, the default is taken fromshow_source_by_default.
- property show_results: bool[source]¶
Whether to show the results of running the example in the code block.
The last occurrence of either
show-resultsorhide-resultsoptions wins. If neither is set, the default is taken fromshow_results_by_default.
- render_code_block(lines, language, target='source')[source]¶
Render the code block with the source code or results.
targetis forwarded tocode_block_options()so theemphasize-lines/emphasize-result-linessplit routes the right highlighting to each block.
- class click_extra.sphinx.click.SourceDirective(name, arguments, options, content, lineno, content_offset, block_text, state, state_machine)[source]¶
Bases:
ClickDirectiveDirective to declare a Click CLI source code.
This directive is used to declare a Click CLI example in the documentation. It renders the source code of the example in a Python code block.
- default_language: str = 'python'¶
Default highlighting language to use to render the code block.
All Pygments’ languages short names are recognized.
- show_source_by_default: bool = True¶
Whether to render the source code of the example in the code block.
- show_results_by_default: bool = False¶
Whether to render the results of the example in the code block.
- runner_method: str = 'execute_source'¶
The name of the method to call on the
ClickRunnerinstance.
- class click_extra.sphinx.click.RunDirective(name, arguments, options, content, lineno, content_offset, block_text, state, state_machine)[source]¶
Bases:
ClickDirectiveDirective to run a Click CLI example.
This directive is used to run a Click CLI example in the documentation. It renders the results of running the example in a shell session code block supporting ANSI colors.
- default_language: str = 'ansi-shell-session'¶
Default highlighting language to use to render the code block.
All Pygments’ languages short names are recognized.
- show_source_by_default: bool = False¶
Whether to render the source code of the example in the code block.
- show_results_by_default: bool = True¶
Whether to render the results of the example in the code block.
- runner_method: str = 'run_cli'¶
The name of the method to call on the
ClickRunnerinstance.
- class click_extra.sphinx.click.DeprecatedExampleDirective(name, arguments, options, content, lineno, content_offset, block_text, state, state_machine)[source]¶
Bases:
SourceDirectiveDeprecated alias for SourceDirective.
Deprecated since version 7.3.0: Use
click:sourceinstead ofclick:example.
- class click_extra.sphinx.click.ClickDomain(env)[source]¶
Bases:
StatelessDomainSetup new directives under the same
clicknamespace:click:sourcewhich renders a Click CLI source codeclick:example, an alias toclick:source(deprecated)click:runwhich renders the results of running a Click CLI
- click_extra.sphinx.click.cleanup_runner(app, doctree)¶
Drop the
ClickRunnerfrom the doctree once the document is read.- Return type: