Upstream¶
Click Extra was born as a collection of patches for unmaintained or slow-moving click-contrib addons. Over time, many of these fixes were contributed back upstream, and the project grew into a significant contributor to the Click ecosystem.
This page tracks click-extra’s relationship with its upstream dependencies: code contributed back, issues reported, workarounds provided, and features that upstream declined.
Code contributed upstream¶
PRs authored by the click-extra maintainer and merged into upstream projects.
click¶
Default and sentinel handling:
#3137- Provide altered context to callbacks to hideUNSETvalues asNone#3068- HideSentinel.UNSETvalues for defaults processed byContext.invoke#3030- Differentiate absence of value and value of absence fordefaultandflag_valuearguments#2956- Fix reconciliation of envvar withdefault,flag_valueandtypeparameters for flag options#3225- Fix callableflag_valuebeing instantiated when used as a default#3224- HideSentinel.UNSETvalues asNoneinlookup_default()#3239- Reconcile default value passing and default activation
Help system:
#2811- Fix eagerness of help option generated byhelp_option_names#2840- Move--helpoption defaults from its class to its decorator
Enum and Choice support:
Testing:
Documentation:
python-tabulate¶
pygments¶
furo¶
cloup¶
pallets-sphinx-themes¶
click-contrib/sphinx-click¶
click-contrib/click-log¶
Upstreamed from click-extra¶
Issues that click-extra solved with local workarounds first. The fix was later contributed upstream and the workaround removed from click-extra.
click¶
#2811/#2563- Help option eagerness and deduplication. click-extra had customHelpOptionfixes; contributed upstream and removed locally.#2680- Callbacks not properly closed on CLI exit. click-extra patchedOptionto force-close; contributed the fix upstream.#2523/#2522-CliRunnerconflating stderr and stdout. click-extra backported the fix before the Click release.#2516/#2517- Help extra items (default, envvar, required) were computed and rendered together. click-extra needed them split to inject colorization; contributed the refactor upstream.
cloup¶
Addressed by click-extra¶
Issues that remain open or unfixed upstream. click-extra provides the solution.
Color and terminal support¶
click-extra implements NO_COLOR, FORCE_COLOR, and full help colorization with a theme system, addressing long-standing Click gaps:
Themes and palettes¶
click-extra ships seven built-in themes (dark, light, dracula, monokai, nord, solarized_dark, plus a monochrome manpage) and is the only Click-ecosystem library that lets end users define new themes or override existing ones from the CLI’s --config file ([tool.<cli>.themes.<name>]). Click itself has no theme system (formatter-level customization is still WIP upstream), and the competing rich help layers expose themes through Python or environment variables, not the CLI’s own configuration file:
click#561- Add Custom Formatter System: open since 2016, the prerequisite for a Click-native theme API.click#3097- WIP: Help page customization low level api: open PR exploring the formatter customization Click maintainers committed to in#561.rich-click#219- Colour themes (can be set by user): closed completed in August 2025; rich-click now ships themes settable viaRICH_CLICK_THEMEenv var or Python config, but not via the wrapped CLI’s own configuration file.rich-click#311- Using themes outside click: open follow-up showing the demand for richer theme reuse.
Configuration validation¶
click-extra’s config pipeline exposes an extension hook (ConfigValidator) so apps can validate data-keyed sub-tables ([tool.<cli>.managers.<id>], [tool.<cli>.plugins], …) inside the same strict-check pipeline that polices CLI-flag-bound keys. --validate-config collects every error before exiting and surfaces all failures with the same rooted ValidationError shape.
This is click-extra’s own design rather than an answer to a documented upstream issue: Click maintainers have closed every config-file proposal as out of scope (#1753, #386, #42, #971) and deferred to external packages, so validation of those external config files lives wherever each package chose to put it. The closest related upstream gap is click_config_file#11 (listed under Configuration files above): “warn when providing unsupported options in the config file?”: open since 2018 in an unmaintained package.
Configuration files¶
click-extra’s config module replaces the functionality of several unmaintained packages, with multi-format support (TOML, YAML, JSON, INI, XML), pyproject.toml integration, and a precedence chain:
Version option¶
click-extra’s VersionOption adds template variables for git metadata (branch, hash, date, tag), environment info, and Python/OS details, with pre-baking for compiled binaries:
Environment variables¶
click-extra auto-generates environment variables for all options and adds show_envvar as a global context setting:
Logging¶
click-extra’s logging module replaces the unmaintained click-log package:
Progress spinner¶
click-extra’s Spinner is a thread-animated, indeterminate progress spinner for blocking work of unknown duration. It supersedes the click-spinner package, last released in 2020 and openly looking for a maintainer since 2022. By design it resolves the issues and pull requests still open or rejected against that package:
click-spinner#27- Support for more spinner types and custom spinners: closed unmerged over maintenance concerns; click-extra accepts anyframessequence and ships a 90-entrySPINNERScatalog ported from cli-spinners (a superset of the molovo/revolver set this PR proposed), including the multi-character animations the PR had to drop because click-spinner’s backspace renderer could not erase them.click-spinner#33- PEP 561 compatible (inline types): closed unmerged and redirected to typeshed; click-extra is fully annotated and shipspy.typed.click-spinner#34- Feature request: spin clockwise /click-spinner#35: open issue, abandoned PR; click-extra exposes areverseflag.click-spinner#36- Spinner left last symbol on cmd /click-spinner#37: open; click-extra erases the line with\r\x1b[Krather than a non-destructive\bthat lingers in terminals like VS Code.click-spinner#41- Fix output in corner cases: open; click-extra always erases on exit and never rings the bell on a disabled or redirected stream.click-spinner#42- Printing to stdout breaks the spinner: open; click-extra defaults tostderrsostdoutdata stays clean, and itsecho()method prints above the animation without corrupting it.
Option parsing¶
Multi-value options¶
click-extra’s MultiChoice type parses a single comma-separated token into a tuple of validated values: the pick-many counterpart to click.Choice, with a rendered [a,b,c] metavar that mirrors click.Choice’s [a|b|c] and per-value highlighting in the help colorizer. The canonical Click idiom for this is multiple=True + Choice, which requires the flag to be repeated (--tag a --tag b --tag c); SQL SELECT a, b, c-style syntax has been requested upstream multiple times and not shipped:
click#2771- Allownargs=-1in options with a non-whitespace separator: open, exactly the same feature request.click#2537- Allownargs=-1forclick.option: closed as not planned, the earlier space-separated variant.
The --columns option on --show-params is the headline consumer; the type is also exposed at the package root for arbitrary tags / categories / modes use cases in downstream CLIs.
Normalized arguments¶
ANSI rendering in documentation¶
click-extra provides ANSI-capable session lexers, an HTML formatter, and Sphinx integration for rendering ANSI-colored CLI output in documentation, with 24-bit true-color rendering enabled by default:
pygments#1148- Can’t format console/shell-session output that includes ANSI colorspygments#477- Support ANSI (ECMA-48) color-coded text inputpygments-ansi-color#33-AnsiHtmlFormatterand ANSI-aware shell-like lexerspygments-ansi-color#35- AddAnsiHtmlFormatter(open, unmaintained upstream)nbsphinx#852- Sphinx & Pygments integration for ANSI rendering
Sphinx click:source and click:run directives¶
click-extra maintains and extends the click:source/click:run directives originally from pallets-sphinx-themes:
Sphinx python:* directives and live document rendering¶
The python:source, python:run, python:render, python:render-myst, and python:render-rst directives extend the click:* family to arbitrary Python (no Click CLI required). The render* variants parse the captured stdout as live document content: generated tables, headings, admonitions, and cross-references become first-class document nodes rather than a code block. This replaces the docs_update.py regenerator + marker-region pattern that many downstream click-extra-consuming projects use (Meta Package Manager, Mail Deduplicate, …), so the rendered HTML is always current at build time without a separate generation step.
The click:* half of this story remains stuck upstream: the directives still live in pallets-sphinx-themes despite open requests to move them where Click users actually look for them, and MyST integration is unfinished:
sphinx-click#158- Move custom directives into Sphinx-click: open, acknowledged by maintainers.sphinx-click#127- Support myst-parser: open, click directives still RST-only upstream.pallets-sphinx-themes#61: open since 2022, also flagged in the previous section.
The python:* half (rendering executed Python output as live document content) is click-extra’s own design rather than an answer to a single upstream ticket.
Declined by upstream¶
PRs and features rejected by upstream maintainers. click-extra provides the functionality regardless.
python-tabulate¶
click-extra maintains a local patch for GitHub-Flavored Markdown table alignment.
dbcli/cli_helpers¶
Open upstream¶
PRs and issues still pending upstream.