Releases: ajalt/clikt
5.0.2
5.0.1
5.0.0
This release splits the package into separate modules to help produce smaller binaries. Parsing and running commands are now separated, which allows for custom run
types. This release includes the SuspendingCliktCommand
and the ChainedCliktCommand
, and it's easy to define your own.
See the migration guide for details on upgrading to Clikt 5.0.
Added
- Publish
iosArm64
andiosX64
targets. - Added
NoSuchArgument
exception that is thrown when too many arguments were given on the command line. Previously, a less specificUsageError
was thrown instead. - Added
CommandLineParser.tokenize
that splits a string into argv tokens. - Added
CommandLineParser
that provides functions for parsing and finalizing commands manually for more control. - Added
Context.invokedSubcommands
that contains all subcommands of the current command that are going to be invoked whenallowMultipleSubcommands
istrue
. - Added
SuspendingCliktCommand
that has asuspend fun run
method, allowing you to use coroutines in your commands. - Added
ChainedCliktCommand
that allows you to return a value from yourrun
method and pass it to the next command in the chain. - Added
Context.data
as an alternative toobj
that allows you to store more than one object in the context. - Added
Context.echoer
to customize howecho
messages are printed. - Added
CompletionGenerator
to manually generate completions for a command. - Added
Context.exitProcess
which you can use to prevent the process from exiting during tests. - Added core module that supports watchOS, tvOS, and wasmWasi targets and has no dependencies.
- Added more options to
CliktCommand.test
to control the terminal interactivity. (#517) - Added
associate{}
,associateBy{}
, andassociateWith{}
transforms for options that allow you to convert the keys and values of the map. (#529) - Added support for aliasing options to other options. (#535)
- Added
limit
andignoreCase
parameters tooption().split()
. (#541) - Support calling
--help
on subcommands when parents have required parameters.
Changed
-
In a subcommand with and an
argument()
withmultiple()
oroptional()
, the behavior is now the same regardless of the value ofallowMultipleSubcommands
: if a token matches a subcommand name, it's now treated as a subcommand rather than a positional argument. -
Due to changes to the internal parsing algorithm, the exact details of error messages when multiple usage errors occur have changed in some cases.
-
Breaking Change: Moved the following parameters from
CliktCommand
's constructor; override the corresponding properties instead:removed parameter replacement property help
fun help
epilog
fun helpEpilog
invokeWithoutSubcommand
val invokeWithoutSubcommand
printHelpOnEmptyArgs
val printHelpOnEmptyArgs
helpTags
val helpTags
autoCompleteEnvvar
val autoCompleteEnvvar
allowMultipleSubcommands
val allowMultipleSubcommands
treatUnknownOptionsAsArgs
val treatUnknownOptionsAsArgs
hidden
val hiddenFromHelp
-
The following methods on
CliktCommand
have been renamed:commandHelp
->help
,commandHelpEpilog
->epilog
. The old names are deprecated. -
Breaking Change:
CliktCommand.main
andCliktCommand.parse
are now extension functions rather than methods. -
Breaking Change:
Context.obj
andContext.terminal
, andOptionTransformContext.terminal
are now extension functions rather than properties. -
Breaking Change: The
RenderedSection
andDefinitionRow
classes have moved toAbstractHelpFormatter
. -
Markdown support in the help formatter is no longer included by default. To enable it, include the
:clikt-markdown
dependency and callyourCommand.installMordantMarkdown()
before parsing. -
Updated Kotlin to 2.0.0
Fixed
- Fixed excess arguments not being reported when
allowMultipleSubcommands=true
and a subcommand has excess arguments followed by another subcommand. - Commands with
printHelpOnEmptyArgs=true
will no longer print help if an option has a value from an environment variable or value source. (#382)
Deprecated
- Deprecated
Context.originalArgv
. It will now always return an empty list. If your commands need an argv, you can pass it to them before you run them, or set in on the newContext.data
map. - Deprecated
Context.expandArgumentFiles
. UseContext.argumentFileReader
instead. - Renamed the following
Context
fields to be more consistent. The old names are deprecated.
old name | new name |
---|---|
Context.envvarReader |
Context.readEnvvar |
Context.correctionSuggestor |
Context.suggestTypoCorrection |
Context.argumentFileReader |
Context.readArgumentFile |
Context.tokenTransformer |
Context.transformToken |
Removed
- Removed previously deprecated experimental annotations.
- Removed
MordantHelpFormatter.graphemeLength
- Removed
TermUi
4.4.0
4.3.0
Added
- Added
limit
parameter tooption().counted()
to limit the number of times the option can be used. You can either clamp the value to the limit, or throw an error if the limit is exceeded. (#483) - Added
Context.registerClosable
andContext.callOnClose
to allow you to register cleanup actions that will be called when the command exits. (#395)
Fixed
4.2.2
4.2.1
Added
- Added
toString
implementations to options and arguments. (#434) - Added
CliktCommand.test
overload that takes a vararg ofString
s as the command line arguments. Thanks to @sschuberth for the contribution (#451)
Fixed
- Update Mordant dependency to fix crashes on native targets and GraalVM (#447)
4.2.0
Added
- Added
requireConfirmation
parameter tooption().prompt()
(#426) - Added
CliktCommand.terminal
extension for accessing the terminal from a command. - Added
includeSystemEnvvars
,ansiLevel
,width
, andheight
parameters to allCliktCommand.test
overloads.
Deprecated
- Deprecated
CliktCommand.prompt
, useCliktCommand.terminal.prompt
orPrompt
instead. - Deprecated
CliktCommand.confirm
, useYesNoPrompt
instead.
4.1.0
Added
- Added
MordantHelpFormatter.renderAttachedOptionValue
that you can override to change how option values are shown, e.g. if you want option to show as--option <value>
instead of--option=<value>
. (#416) - Added
option().optionalValueLazy{}
, which work likeoptionalValue()
but the default value is computed lazily. (#381)
Changed
- Updated Kotlin to 1.9.0
PrintMessage
,PrintHelpMessage
andPrintCompletionMessage
now default to exiting with a status code 0, which is the behavior they had in 3.x. (#419)
4.0.0
Clikt 4.0 is a major release that uses the Mordant library for help formatting. If you aren't
customizing help output, this upgrade will probably be source compatible.
Highlights
Here are some of the highlights of this release. See CHANGELOG.md
for a detailed list of changes.
Colors and Markdown in help output
All help strings now support markdown, including tables and lists. On terminals that support it,
help and error messages will be colored.
class Command : CliktCommand(
help="""
## This command uses markdown for its help text
- You can use lists
- You can use **bold** and *italic* text
- You can even use [links](https://example.com) on terminals that support them
| You | can | use | tables |
|-----------|--------|------|--------|
| and | they | will | be |
| formatted | nicely | for | you |
""".trimIndent()
)
$ ./command --help
Usage: command [<options>]
───── This command uses markdown for its help text ─────
• You can use lists
• You can use bold and italic text
• You can even use links on terminals that support them
┌───────────┬────────┬──────┬────────┐
│ You │ can │ use │ tables │
╞═══════════╪════════╪══════╪════════╡
│ and │ they │ will │ be │
├───────────┼────────┼──────┼────────┤
│ formatted │ nicely │ for │ you │
└───────────┴────────┴──────┴────────┘
There are new lazy extensions for setting paramter help that you can use to add color to parameter help text:
option().help { theme.info("this text will use the theme color") }
Optional and vararg values for options
You can now use optionalValue()
to create an option that can be used as a flag or with a value
val log by option().optionalValue("verbose").default("none")
> ./tool --log=debug
log level == debug
> ./tool --log
log level == verbose
> ./tool
log level == none
You can also use varargValues()
to create an option that accepts a variable number of values.
Streamlined error handling
Clikt's exceptions now all inherit from CliktError
, and the CliktCommand.getFormattedHelp
method renders them into strings for you. This makes customizing main
much easier. The default
implementation is now just:
fun main(argv: List<String>) {
try {
parse(argv)
} catch (e: CliktError) {
echoFormattedHelp(e)
exitProcess(e.statusCode)
}
}