Add built-in shell completion support for PowerShell (Windows PowerShell
5.1+ and pwsh 7+) alongside the existing bash, zsh, and fish
completers. Use _FOO_BAR_COMPLETE=powershell_source foo-bar to generate
the completion script. {issue}2672 {pr}3637
Supported versions of Windows enable ANSI terminal styles by default.
Colorama is no longer a dependency and is not used. {issue}2986 {pr}3505
{class}Argument accepts a help parameter, and help output includes
a Positional arguments section when argument help is available. {issue}2983 {pr}3473
confirm() and prompt() strip ANSI color and style codes from the
prompt when the output stream does not support them, matching echo().
This stripping was lost in 8.4.0 when {pr}2969 began writing the
prompt with input() directly. {issue}3572 {pr}3653
Fix test failures when using pytest >= 9.1. {pr}3656
{class}Path with allow_dash=True no longer triggers a BytesWarning,
an error under python -bb, when checking a value against the -
convention. {issue}2877 {pr}3642
Add {func}custom_version_option, a --version option whose output is
produced by a callback, covering cases {func}version_option intentionally
does not. The feature set of {func}version_option is now frozen; see discussion #3527. {pr}3581
style() and secho() no longer silently drop the 256-color index 0
(black) passed as fg or bg, and now validate color arguments. Invalid
colors raise a ValueError instead of a TypeError. {pr}3677
The automatic help option stores its value under the reserved name
_click_default_help instead of help, so a parameter named help no
longer breaks parsing. The new name is visible in
{meth}Command.to_info_dict output. Parameters that overwrite each other's
value trigger a warning: an argument sharing its name with another
parameter, or any parameter claiming the reserved name. Options may still
share a name to compete for the same value (feature switches).
{issue}2819 {pr}3678
unstyle and the ANSI handling behind help-text wrapping now strip the full
CSI escape-sequence grammar. {pr}3681
Streamline Option flag handling: the flag-kind, type, lazy-default and
validation steps in Option.__init__ move into focused helpers, and
flag_value and default keep their unset sentinel at construction
(resolved lazily on read) so is UNSET reliably tells a user-supplied value
from an auto-derived one. Runtime behavior is unchanged, but
{meth}Parameter.to_info_dict now resolves default=True on a feature
switch to its flag_value, matching what the function receives at call
time. {pr}3641
{func}get_binary_stream and {func}get_text_stream are deprecated and
will be removed in Click 9.0. {issue}3481 {pr}3695
The following click.utils names were never intentionally public and are
now private (_-prefixed). The old names remain available with a
DeprecationWarning until Click 9.0: LazyFile, KeepOpenFile,
make_default_short_help, PacifyFlushWrapper, and safecall.
{issue}3099 {pr}3695
Deprecate {meth}CliRunner.isolated_filesystem. It relies on
{func}os.chdir, which mutates process-global state and is not
thread-safe. The helper predates Python 3 and modern pytest: use a
temporary directory ({class}tempfile.TemporaryDirectory or pytest's
tmp_path fixture) with absolute paths instead. For running tests in
parallel, use process-based isolation (such as pytest-xdist) rather
than threads, since {meth}CliRunner.invoke also redirects the
process-global standard streams. {issue}3501 {issue}3700 {pr}3704
prompt() is now generically typed and returns the type produced by
type, value_proc, or a matching default instead of Any.
{class}ParamType takes a second optional type parameter describing the
input value it accepts (ParamType[int, str] for a type converting
strings to integers), defaulting to Any. {pr}3407
{meth}Command.get_help_option_names returns the help option names in the
order they were declared. {pr}3728
{func}get_pager_file yields a text stream on Windows again. The temporary
file backend opened its file in binary mode, so writing a str to the pager
raised TypeError: a bytes-like object is required, not 'str', and the
color argument was ignored on that path. Regression introduced in 8.4.0
by {pr}1572. {issue}3731 {issue}3732 {issue}3740 {pr}3739
{func}progressbar settles on its final position when update_min_steps
does not divide the total. Steps below that threshold are applied when the
bar finishes, so show_pos renders 20/20 rather than the last multiple
it reached. {issue}3571 {pr}3769
An error raised while writing to the pager no longer gets replaced by
PermissionError: [WinError 32] on Windows. The temporary file backend
unlinked its file without closing it first, and Windows refuses to remove a
file the process still holds open, so the cleanup failure masked the real
exception. {issue}3731 {pr}3764
The temporary file the pager writes to on Windows is opened with the encoding
{func}get_pager_file picked for the output stream, and with
errors="replace" to match the pipe backend. Any text stdout can encode
reaches the pager.
The temporary file pager backend forwards any parameters the user set in
PAGER to the pager command instead of silently dropping them. On Windows,
PAGER="less -R" now invokes less -R on the temporary file rather than
bare less. {pr}3777
Improve raw mode detection by parsing the option tokens. {issue}3416
{pr}3777
{func}edit accepts os.PathLike values for filename, in addition to
strings. {issue}2869 {pr}3781
Fix Fish shell completion broken in 8.4.0 by {pr}3126. Newlines and
tabs in option help text are now escaped, keeping the original completion
format while still supporting multi-line help. {issue}3502
{issue}3043 {pr}3504 {pr}3508
Deprecated commands and options with empty or missing help text no longer
render a stray leading space before the (DEPRECATED) label. {pr}3509
A {class}Group with invoke_without_command=True marks its subcommand as
optional in the usage help, showing [COMMAND] instead of COMMAND.
{issue}3059 {pr}3507
echo_via_pager flushes after each write, so passing a generator streams
output to the pager incrementally instead of staying hidden until the pipe
buffer fills. {issue}3242 {issue}2542 {pr}3534
echo_via_pager and get_pager_file no longer close a borrowed stdout
stream when no external pager runs, completing the partial
I/O operation on closed file fix from {pr}3482. {issue}3449
{pr}3533
Fix CLI usage symopsis for optional arguments producing double square brackets
[[a|b|c]]... whose type already brackets their metavar. {pr}3578
{func}version_option resolves a package_name that does not match an
installed distribution as an import (top-level module) name via
{func}importlib.metadata.packages_distributions. Packages whose
top-level module name differs from their distribution name (PIL vs
Pillow, jwt vs PyJWT) no longer raise RuntimeError out of the
box. {issue}2331 {issue}1884 {issue}3125 {pr}3582
:class:ParamType is now a generic abstract base class,
parameterized by its converted value type.
:meth:~ParamType.convert return types are narrowed on all
concrete types (str for :class:STRING, int for
:class:INT, etc.).
:meth:~ParamType.to_info_dict returns specific
:class:~typing.TypedDict subclasses instead of
dict[str, Any].
:class:CompositeParamType and the number-range base are now
generic with abstract methods.
Refactor convert_type to extract type inference into a private
_guess_type helper, and add :func:typing.overload signatures.
:pr:3372
:class:Parameter typing improvements. :pr:2805
:class:Parameter is now an abstract base class, making explicit
that it cannot be instantiated directly.
:attr:Parameter.name is now str instead of str | None.
When expose_value=False, the name is set to "" instead
of None.
The ctx parameter of :meth:Parameter.get_error_hint is now
typed as Context | None, matching the runtime behavior.
Split string values from default_map for parameters with nargs > 1
or :class:Tuple type, matching environment variable behavior.
:issue:2745 :pr:3364
Auto-detect type=UNPROCESSED for flag_value of non-basic types
(not str, int, float, or bool), so programmer-provided
Python objects like classes and enum members are passed through unchanged
instead of being stringified. Previously type=click.UNPROCESSED had
to be set explicitly. :issue:2012 :pr:3363
The error hint now uses :meth:Command.get_help_option_names to pick
non-shadowed help option names, so Try '... -h' no longer points to a
subcommand option that shadows -h. The longest surviving name is
shown (--help over -h) for readability. :issue:2790 :pr:3208
Fix readline functionality on non-Windows platforms. Prompt text is now
passed directly to readline instead of being printed separately, allowing
proper backspace, line editing, and line wrapping behavior. :issue:2968
:pr:2969
Use :func:os.startfile on Windows to open URLs in :func:open_url,
replacing the start built-in which cannot be invoked without
shell=True. :issue:3164 :pr:3186
Fix Fish shell completion errors when option help text contains newlines.
:issue:3043 :pr:3126
Add :class:NoSuchCommand exception with suggestions for misspelled
commands. :issue:3107 :pr:3228
Use :class:ValueError message when conversion in :class:FuncParamType would
fail. :issue:3105 :pr:3211
Add click.get_pager_file for file-like access to an output
pager. :pr:1572 :pr:3405
:func:~click.formatting.wrap_text now measures line width in visible
characters, ignoring ANSI escape sequences. :pr:3420
Fix :meth:HelpFormatter.write_usage emitting only a blank line when
called without args. The usage prefix and program name are now
written even when no arguments follow, and the trailing separator
space is stripped so the line ends at the program name.
:issue:3360 :pr:3434
Show custom error messages from types when :func:prompt with
hide_input=True fails validation, instead of always showing a
generic message. Built-in type messages mask the input value.
:issue:2809 :pr:3256
Add capture parameter to :class:CliRunner with two modes: sys
(default) and fd. fd redirects file descriptors 1 and 2
via :func:os.dup2 so output that bypasses sys.stdout (stale stream
references, C extensions, subprocesses, faulthandler) is captured
with proper isolation. :issue:854 :issue:2412 :issue:2468
:issue:2497 :issue:2761 :issue:2827 :issue:2865 :pr:3391
Revert the 8.3.3 change that exposed the original file descriptor
via fileno() on the redirected CliRunner streams in the default
capture mode. os.dup2(w, sys.stdout.fileno()) calls inside a CLI no
longer mutate the host runner's stdout, which broke Pytest's fd-level
capture teardown. C-level consumers that need a real fd should use
capture="fd". :issue:3384 :pr:3391
Mark additional built-in strings with gettext() to extend translation
coverage. :pr:2902
Fix feature switch groups (several flag_value options sharing one
parameter name) silently dropping an explicit default when a sibling
option without an explicit default was declared first. Arbitration is now
source-aware: a more explicit :class:ParameterSource always wins, and
within ParameterSource.DEFAULT, an option that received an explicit
default= keyword wins over a sibling whose default was auto-derived.
The 8.3.x first-wins fallback for remaining ties was reverted to the
pre-8.3.x last-wins fallback. :issue:3403 :pr:3404
Fix missing space between option help text and the (DEPRECATED)
label, and localize the option label so it matches the command label.
The label and the DeprecationWarning reason suffix are now produced
by shared helpers. :pr:3423
Document short option stacking (-abc is parsed as -a -b -c) and
clarify that multi-character short option names are not supported.
:issue:2779 :pr:3431
Fix handling of flag_value when is_flag=False to allow such options to be
used without an explicit value. :issue:3084 :pr:3152
Hide Sentinel.UNSET values as None when using lookup_default().
:issue:3136 :pr:3199 :pr:3202 :pr:3209 :pr:3212 :pr:3224
Prevent _NamedTextIOWrapper from closing streams owned by StreamMixer.
:issue:824 :issue:2991 :issue:2993 :issue:3110 :pr:3139 :pr:3140
Add comprehensive tests for CliRunner stream lifecycle, covering
logging interaction, multi-threaded safety, and sequential invocation
isolation. Add high-iteration stress tests behind a stress marker
with a dedicated CI job. :pr:3139
Fix callable flag_value being instantiated when used as a default via
default=True. :issue:3121 :pr:3201 :pr:3213 :pr:3225
This is the Click 8.3.1 fix release, which fixes bugs but does not otherwise change behavior and should not result in breaking changes compared to the latest feature release.
Fix reconciliation of default, flag_value and type parameters for
flag options, as well as parsing and normalization of environment variables.
:issue:2952 :pr:2956
Fix typing issue in BadParameter and MissingParameter exceptions for the
parameter param_hint that did not allow for a sequence of string where the
underlying function _join_param_hints allows for it. :issue:2777 :pr:2990
Use the value of Enum choices to render their default value in help
screen. Refs :issue:2911 :pr:3004
Fix completion for the Z shell (zsh) for completion items containing
colons. :issue:2703 :pr:2846
Don't include envvar in error hint when not configured. :issue:2971 :pr:2972
Fix a rare race in click.testing.StreamMixer's finalization that manifested
as a ValueError on close in a multi-threaded test session.
:issue:2993 :pr:2991
Drop support for Python 3.7, 3.8, and 3.9. :pr:2588 :pr:2893
Use modern packaging metadata with pyproject.toml instead of setup.cfg.
:pr:2438
Use flit_core instead of setuptools as build backend. :pr:2543
Deprecate the __version__ attribute. Use feature detection, or
importlib.metadata.version("click"), instead. :issue:2598
BaseCommand is deprecated. Command is the base class for all
commands. :issue:2589
MultiCommand is deprecated. Group is the base class for all group
commands. :issue:2590
The current parser and related classes and methods, are deprecated.
:issue:2205
OptionParser and the parser module, which is a modified copy of
optparse in the standard library.
Context.protected_args is unneeded. Context.args contains any
remaining arguments while parsing.
Parameter.add_to_parser (on both Argument and Option) is
unneeded. Parsing works directly without building a separate parser.
split_arg_string is moved from parser to shell_completion.
Enable deferred evaluation of annotations with
from __future__ import annotations. :pr:2270
When generating a command's name from a decorated function's name, the
suffixes _command, _cmd, _group, and _grp are removed.
:issue:2322
Show the types.ParamType.name for types.Choice options within
--help message if show_choices=False is specified.
:issue:2356
Do not display default values in prompts when Option.show_default is
False. :pr:2509
Add get_help_extra method on Option to fetch the generated extra
items used in get_help_record to render help text. :issue:2516
:pr:2517
Keep stdout and stderr streams independent in CliRunner. Always
collect stderr output and never raise an exception. Add a new
output stream to simulate what the user sees in its terminal. Removes
the mix_stderr parameter in CliRunner. :issue:2522 :pr:2523
Option.show_envvar now also shows environment variable in error messages.
:issue:2695 :pr:2696
Context.close will be called on exit. This results in all
Context.call_on_close callbacks and context managers added via
Context.with_resource to be closed on exit as well. :pr:2680
Add ProgressBar(hidden: bool) to allow hiding the progressbar. :issue:2609
A UserWarning will be shown when multiple parameters attempt to use the
same name. :issue:2396
When using Option.envvar with Option.flag_value, the flag_value
will always be used instead of the value of the environment variable.
:issue:2746 :pr:2788
Add Choice.get_invalid_choice_message method for customizing the
invalid choice message. :issue:2621 :pr:2622
If help is shown because no_args_is_help is enabled (defaults to True
for groups, False for commands), the exit code is 2 instead of 0.
:issue:1489 :pr:1489
Contexts created during shell completion are closed properly, fixing
a ResourceWarning when using click.File. :issue:2644 :pr:2800
:pr:2767
click.edit(filename) now supports passing an iterable of filenames in
case the editor supports editing multiple files at once. Its return type
is now also typed: AnyStr if text is passed, otherwise None.
:issue:2067 :pr:2068
Specialized typing of progressbar(length=...) as ProgressBar[int].
:pr:2630
Improve echo_via_pager behaviour in face of errors.
:issue:2674
Terminate the pager in case a generator passed to echo_via_pager
raises an exception.
Ensure to always close the pipe to the pager process and wait for it
to terminate.
echo_via_pager will not ignore KeyboardInterrupt anymore. This
allows the user to search for future output of the generator when
using less and then aborting the program using ctrl-c.
deprecated: bool | str can now be used on options and arguments. This
previously was only available for Command. The message can now also be
customised by using a str instead of a bool. :issue:2263 :pr:2271
Command.deprecated formatting in --help changed from
(Deprecated) help to help (DEPRECATED).
Parameters cannot be required nor prompted or an error is raised.
A warning will be printed when something deprecated is used.
Add a catch_exceptions parameter to CliRunner. If
catch_exceptions is not passed to CliRunner.invoke, the value
from CliRunner is used. :issue:2817 :pr:2818
Option.flag_value will no longer have a default value set based on
Option.default if Option.is_flag is False. This results in
Option.default not needing to implement __bool__. :pr:2829
Incorrect click.edit typing has been corrected. :pr:2804
Choice is now generic and supports any iterable value.
This allows you to use enums and other non-str values. :pr:2796
:issue:605
Fix setup of help option's defaults when using a custom class on its
decorator. Removes HelpOption. :issue:2832 :pr:2840
Configuration
📅 Schedule: (UTC)
Branch creation
At any time (no schedule defined)
Automerge
At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
If you want to rebase/retry this PR, check this box
renovateBot
changed the title
chore(deps): update dependency click to <8.3.1, >=8.3.0
chore(deps): update dependency click to <8.3.2, >=8.3.1
Nov 15, 2025
renovateBot
changed the title
chore(deps): update dependency click to <8.3.4, >=8.3.3
chore(deps): update dependency click to <8.4.1, >=8.4.0
May 17, 2026
renovateBot
changed the title
chore(deps): update dependency click to <8.4.1, >=8.4.0
chore(deps): update dependency click to <8.4.2, >=8.4.1
May 22, 2026
renovateBot
changed the title
chore(deps): update dependency click to <8.4.2, >=8.4.1
chore(deps): update dependency click to <8.4.3, >=8.4.2
Jun 24, 2026
renovateBot
changed the title
chore(deps): update dependency click to <8.4.3, >=8.4.2
chore(deps): update dependency click to <8.5.1, >=8.5.0
Aug 26, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
Release Notes
pallets/click (click)v8.5.0
Compare Source
Released 2026-08-24
5.1+ and pwsh 7+) alongside the existing bash, zsh, and fish
completers. Use _FOO_BAR_COMPLETE=powershell_source foo-bar to generate
the completion script. {issue}2672 {pr}3637
Colorama is no longer a dependency and is not used. {issue}2986 {pr}3505
a Positional arguments section when argument help is available. {issue}2983 {pr}3473
prompt when the output stream does not support them, matching echo().
This stripping was lost in 8.4.0 when {pr}2969 began writing the
prompt with input() directly. {issue}3572 {pr}3653
an error under python -bb, when checking a value against the -
convention. {issue}2877 {pr}3642
produced by a callback, covering cases {func}version_option intentionally
does not. The feature set of {func}version_option is now frozen; see
discussion #3527. {pr}3581
(black) passed as fg or bg, and now validate color arguments. Invalid
colors raise a ValueError instead of a TypeError. {pr}3677
_click_default_help instead of help, so a parameter named help no
longer breaks parsing. The new name is visible in
{meth}Command.to_info_dict output. Parameters that overwrite each other's
value trigger a warning: an argument sharing its name with another
parameter, or any parameter claiming the reserved name. Options may still
share a name to compete for the same value (feature switches).
{issue}2819 {pr}3678
CSI escape-sequence grammar. {pr}3681
validation steps in Option.__init__ move into focused helpers, and
flag_value and default keep their unset sentinel at construction
(resolved lazily on read) so is UNSET reliably tells a user-supplied value
from an auto-derived one. Runtime behavior is unchanged, but
{meth}Parameter.to_info_dict now resolves default=True on a feature
switch to its flag_value, matching what the function receives at call
time. {pr}3641
will be removed in Click 9.0. {issue}3481 {pr}3695
now private (_-prefixed). The old names remain available with a
DeprecationWarning until Click 9.0: LazyFile, KeepOpenFile,
make_default_short_help, PacifyFlushWrapper, and safecall.
{issue}3099 {pr}3695
{func}os.chdir, which mutates process-global state and is not
thread-safe. The helper predates Python 3 and modern pytest: use a
temporary directory ({class}tempfile.TemporaryDirectory or pytest's
tmp_path fixture) with absolute paths instead. For running tests in
parallel, use process-based isolation (such as pytest-xdist) rather
than threads, since {meth}CliRunner.invoke also redirects the
process-global standard streams. {issue}3501 {issue}3700 {pr}3704
type, value_proc, or a matching default instead of Any.
{class}ParamType takes a second optional type parameter describing the
input value it accepts (ParamType[int, str] for a type converting
strings to integers), defaulting to Any. {pr}3407
order they were declared. {pr}3728
file backend opened its file in binary mode, so writing a str to the pager
raised TypeError: a bytes-like object is required, not 'str', and the
color argument was ignored on that path. Regression introduced in 8.4.0
by {pr}1572. {issue}3731 {issue}3732 {issue}3740 {pr}3739
does not divide the total. Steps below that threshold are applied when the
bar finishes, so show_pos renders 20/20 rather than the last multiple
it reached. {issue}3571 {pr}3769
PermissionError: [WinError 32] on Windows. The temporary file backend
unlinked its file without closing it first, and Windows refuses to remove a
file the process still holds open, so the cleanup failure masked the real
exception. {issue}3731 {pr}3764
{func}get_pager_file picked for the output stream, and with
errors="replace" to match the pipe backend. Any text stdout can encode
reaches the pager.
PAGER to the pager command instead of silently dropping them. On Windows,
PAGER="less -R" now invokes less -R on the temporary file rather than
bare less. {pr}3777
{pr}3777
strings. {issue}2869 {pr}3781
v8.4.2
Compare Source
Released 2026-06-24
tabs in option help text are now escaped, keeping the original completion
format while still supporting multi-line help. {issue}3502
{issue}3043 {pr}3504 {pr}3508
render a stray leading space before the (DEPRECATED) label. {pr}3509
optional in the usage help, showing [COMMAND] instead of COMMAND.
{issue}3059 {pr}3507
output to the pager incrementally instead of staying hidden until the pipe
buffer fills. {issue}3242 {issue}2542 {pr}3534
stream when no external pager runs, completing the partial
I/O operation on closed file fix from {pr}3482. {issue}3449
{pr}3533
[[a|b|c]]... whose type already brackets their metavar. {pr}3578
installed distribution as an import (top-level module) name via
{func}importlib.metadata.packages_distributions. Packages whose
top-level module name differs from their distribution name (PIL vs
Pillow, jwt vs PyJWT) no longer raise RuntimeError out of the
box. {issue}2331 {issue}1884 {issue}3125 {pr}3582
v8.4.1
Compare Source
Released 2026-05-21
conversion again. :issue:3458 :issue:3484
result. :issue:3015
v8.4.0
Compare Source
Released 2026-05-17
:class:ParamType typing improvements. :pr:3371
parameterized by its converted value type.
concrete types (str for :class:STRING, int for
:class:INT, etc.).
:class:~typing.TypedDict subclasses instead of
dict[str, Any].
generic with abstract methods.
Refactor convert_type to extract type inference into a private
_guess_type helper, and add :func:typing.overload signatures.
:pr:3372
:class:Parameter typing improvements. :pr:2805
that it cannot be instantiated directly.
When expose_value=False, the name is set to "" instead
of None.
typed as Context | None, matching the runtime behavior.
Split string values from default_map for parameters with nargs > 1
or :class:Tuple type, matching environment variable behavior.
:issue:2745 :pr:3364
Auto-detect type=UNPROCESSED for flag_value of non-basic types
(not str, int, float, or bool), so programmer-provided
Python objects like classes and enum members are passed through unchanged
instead of being stringified. Previously type=click.UNPROCESSED had
to be set explicitly. :issue:2012 :pr:3363
The error hint now uses :meth:Command.get_help_option_names to pick
non-shadowed help option names, so Try '... -h' no longer points to a
subcommand option that shadows -h. The longest surviving name is
shown (--help over -h) for readability. :issue:2790 :pr:3208
Fix readline functionality on non-Windows platforms. Prompt text is now
passed directly to readline instead of being printed separately, allowing
proper backspace, line editing, and line wrapping behavior. :issue:2968
:pr:2969
Use :func:os.startfile on Windows to open URLs in :func:open_url,
replacing the start built-in which cannot be invoked without
shell=True. :issue:3164 :pr:3186
Fix Fish shell completion errors when option help text contains newlines.
:issue:3043 :pr:3126
Add :class:NoSuchCommand exception with suggestions for misspelled
commands. :issue:3107 :pr:3228
Use :class:ValueError message when conversion in :class:FuncParamType would
fail. :issue:3105 :pr:3211
Add click.get_pager_file for file-like access to an output
pager. :pr:1572 :pr:3405
:func:~click.formatting.wrap_text now measures line width in visible
characters, ignoring ANSI escape sequences. :pr:3420
Fix :meth:HelpFormatter.write_usage emitting only a blank line when
called without args. The usage prefix and program name are now
written even when no arguments follow, and the trailing separator
space is stripped so the line ends at the program name.
:issue:3360 :pr:3434
Show custom error messages from types when :func:prompt with
hide_input=True fails validation, instead of always showing a
generic message. Built-in type messages mask the input value.
:issue:2809 :pr:3256
Add capture parameter to :class:CliRunner with two modes: sys
(default) and fd. fd redirects file descriptors 1 and 2
via :func:os.dup2 so output that bypasses sys.stdout (stale stream
references, C extensions, subprocesses, faulthandler) is captured
with proper isolation. :issue:854 :issue:2412 :issue:2468
:issue:2497 :issue:2761 :issue:2827 :issue:2865 :pr:3391
Revert the 8.3.3 change that exposed the original file descriptor
via fileno() on the redirected CliRunner streams in the default
capture mode. os.dup2(w, sys.stdout.fileno()) calls inside a CLI no
longer mutate the host runner's stdout, which broke Pytest's fd-level
capture teardown. C-level consumers that need a real fd should use
capture="fd". :issue:3384 :pr:3391
Mark additional built-in strings with gettext() to extend translation
coverage. :pr:2902
Fix feature switch groups (several flag_value options sharing one
parameter name) silently dropping an explicit default when a sibling
option without an explicit default was declared first. Arbitration is now
source-aware: a more explicit :class:ParameterSource always wins, and
within ParameterSource.DEFAULT, an option that received an explicit
default= keyword wins over a sibling whose default was auto-derived.
The 8.3.x first-wins fallback for remaining ties was reverted to the
pre-8.3.x last-wins fallback. :issue:3403 :pr:3404
Fix missing space between option help text and the (DEPRECATED)
label, and localize the option label so it matches the command label.
The label and the DeprecationWarning reason suffix are now produced
by shared helpers. :pr:3423
Document short option stacking (-abc is parsed as -a -b -c) and
clarify that multi-character short option names are not supported.
:issue:2779 :pr:3431
v8.3.3
Compare Source
v8.3.2
Compare Source
Released 2026-04-02
used without an explicit value. :issue:3084 :pr:3152
:issue:3136 :pr:3199 :pr:3202 :pr:3209 :pr:3212 :pr:3224
:issue:824 :issue:2991 :issue:2993 :issue:3110 :pr:3139 :pr:3140
logging interaction, multi-threaded safety, and sequential invocation
isolation. Add high-iteration stress tests behind a stress marker
with a dedicated CI job. :pr:3139
default=True. :issue:3121 :pr:3201 :pr:3213 :pr:3225
v8.3.1
Compare Source
This is the Click 8.3.1 fix release, which fixes bugs but does not otherwise change behavior and should not result in breaking changes compared to the latest feature release.
PyPI: https://pypi.org/project/click/8.3.1/
Changes: https://click.palletsprojects.com/page/changes/#version-8-3-1
Milestone: https://github.com/pallets/click/milestone/28
v8.3.0
Compare Source
Released 2025-09-17
Improved flag option handling: Reworked the relationship between flag_value
and default parameters for better consistency:
to CLI functions (no more unexpected transformations)
by defaulting to their flag_value
:issue:3024 :pr:3030
Allow default to be set on Argument for nargs = -1. :issue:2164
:pr:3030
Show correct auto complete value for nargs option in combination with flag
option :issue:2813
Fix handling of quoted and escaped parameters in Fish autocompletion. :issue:2995 :pr:3013
Lazily import shutil. :pr:3023
Properly forward exception information to resources registered with
click.core.Context.with_resource(). :issue:2447 :pr:3058
Fix regression related to EOF handling in CliRunner. :issue:2939 :pr:2940
v8.2.2
Compare Source
Released 2025-07-31
flag options, as well as parsing and normalization of environment variables.
:issue:2952 :pr:2956
parameter param_hint that did not allow for a sequence of string where the
underlying function _join_param_hints allows for it. :issue:2777 :pr:2990
screen. Refs :issue:2911 :pr:3004
colons. :issue:2703 :pr:2846
as a ValueError on close in a multi-threaded test session.
:issue:2993 :pr:2991
v8.2.1
Compare Source
Released 2025-05-20
:issue:2897 :pr:2930
v8.2.0
Compare Source
Released 2025-05-10
Drop support for Python 3.7, 3.8, and 3.9. :pr:2588 :pr:2893
Use modern packaging metadata with pyproject.toml instead of setup.cfg.
:pr:2438
Use flit_core instead of setuptools as build backend. :pr:2543
Deprecate the __version__ attribute. Use feature detection, or
importlib.metadata.version("click"), instead. :issue:2598
BaseCommand is deprecated. Command is the base class for all
commands. :issue:2589
MultiCommand is deprecated. Group is the base class for all group
commands. :issue:2590
The current parser and related classes and methods, are deprecated.
:issue:2205
optparse in the standard library.
remaining arguments while parsing.
unneeded. Parsing works directly without building a separate parser.
Enable deferred evaluation of annotations with
from __future__ import annotations. :pr:2270
When generating a command's name from a decorated function's name, the
suffixes _command, _cmd, _group, and _grp are removed.
:issue:2322
Show the types.ParamType.name for types.Choice options within
--help message if show_choices=False is specified.
:issue:2356
Do not display default values in prompts when Option.show_default is
False. :pr:2509
Add get_help_extra method on Option to fetch the generated extra
items used in get_help_record to render help text. :issue:2516
:pr:2517
Keep stdout and stderr streams independent in CliRunner. Always
collect stderr output and never raise an exception. Add a new
output stream to simulate what the user sees in its terminal. Removes
the mix_stderr parameter in CliRunner. :issue:2522 :pr:2523
Option.show_envvar now also shows environment variable in error messages.
:issue:2695 :pr:2696
Context.close will be called on exit. This results in all
Context.call_on_close callbacks and context managers added via
Context.with_resource to be closed on exit as well. :pr:2680
Add ProgressBar(hidden: bool) to allow hiding the progressbar. :issue:2609
A UserWarning will be shown when multiple parameters attempt to use the
same name. :issue:2396
When using Option.envvar with Option.flag_value, the flag_value
will always be used instead of the value of the environment variable.
:issue:2746 :pr:2788
Add Choice.get_invalid_choice_message method for customizing the
invalid choice message. :issue:2621 :pr:2622
If help is shown because no_args_is_help is enabled (defaults to True
for groups, False for commands), the exit code is 2 instead of 0.
:issue:1489 :pr:1489
Contexts created during shell completion are closed properly, fixing
a ResourceWarning when using click.File. :issue:2644 :pr:2800
:pr:2767
click.edit(filename) now supports passing an iterable of filenames in
case the editor supports editing multiple files at once. Its return type
is now also typed: AnyStr if text is passed, otherwise None.
:issue:2067 :pr:2068
Specialized typing of progressbar(length=...) as ProgressBar[int].
:pr:2630
Improve echo_via_pager behaviour in face of errors.
:issue:2674
raises an exception.
to terminate.
allows the user to search for future output of the generator when
using less and then aborting the program using ctrl-c.
deprecated: bool | str can now be used on options and arguments. This
previously was only available for Command. The message can now also be
customised by using a str instead of a bool. :issue:2263 :pr:2271
(Deprecated) help to help (DEPRECATED).
Add a catch_exceptions parameter to CliRunner. If
catch_exceptions is not passed to CliRunner.invoke, the value
from CliRunner is used. :issue:2817 :pr:2818
Option.flag_value will no longer have a default value set based on
Option.default if Option.is_flag is False. This results in
Option.default not needing to implement __bool__. :pr:2829
Incorrect click.edit typing has been corrected. :pr:2804
Choice is now generic and supports any iterable value.
This allows you to use enums and other non-str values. :pr:2796
:issue:605
Fix setup of help option's defaults when using a custom class on its
decorator. Removes HelpOption. :issue:2832 :pr:2840
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.