44from collections .abc import Iterable
55from dataclasses import dataclass , replace
66from itertools import groupby
7- from typing import Any , Sequence , cast
7+ from typing import Any , Sequence , Tuple , cast
88
99from rich .console import Console , NewLine
1010from rich .markdown import Markdown
3131TextComponent = typing .Union [Text , Markdown , str ]
3232ArgFormat : TypeAlias = typing .Union [
3333 TextComponent ,
34- typing .Sequence [
35- typing .Union [
36- TextComponent ,
37- typing .Callable [[Arg [Any ]], typing .Union [TextComponent , None ]],
38- ]
39- ],
4034 typing .Callable [[Arg [Any ]], typing .Union [TextComponent , None ]],
4135]
36+ ArgFormats : TypeAlias = typing .Sequence [ArgFormat ]
4237
4338
4439class HelpFormattable (typing .Protocol ):
4540 left_padding : Dimension
46- arg_format : ArgFormat
41+ arg_format : ArgFormat | ArgFormats
4742 default_format : str
4843
4944 def __call__ (
@@ -117,7 +112,7 @@ def create_completion_arg(completion: bool | Arg[bool] = True) -> Arg[bool] | No
117112@dataclass (frozen = True )
118113class HelpFormatter (HelpFormattable ):
119114 left_padding : Dimension = (0 , 0 , 0 , 2 )
120- arg_format : ArgFormat = (
115+ arg_format : ArgFormat | ArgFormats = (
121116 Markdown ("{help}" ),
122117 Markdown ("{choices}" ),
123118 Markdown ("{default}" , style = "dim italic" ),
@@ -143,8 +138,12 @@ def __call__(self, command: Command[Any], prog: str) -> list[Displayable]:
143138 lines .extend (add_long_args (console , self , arg_groups ))
144139 return lines
145140
146- def with_arg_format (self , _format : ArgFormat , * formats : ArgFormat ) -> Self :
147- format = _format if isinstance (_format , tuple ) else (_format ,)
141+ def with_arg_format (
142+ self , _format : ArgFormat | tuple [ArgFormat , ...], * formats : ArgFormat
143+ ) -> Self :
144+ format = cast (
145+ Tuple [ArgFormat , ...], _format if isinstance (_format , tuple ) else (_format ,)
146+ )
148147 arg_format = (* format , * formats )
149148 return replace (self , arg_format = arg_format )
150149
@@ -185,9 +184,13 @@ def add_long_args(
185184def format_arg (
186185 console : Console , help_formatter : HelpFormattable , arg : Arg [Any ]
187186) -> Displayable :
188- arg_format = help_formatter .arg_format
189- if not isinstance (arg_format , Iterable ) or isinstance (arg_format , str ):
190- arg_format = (arg_format ,)
187+ unknown_arg_format = help_formatter .arg_format
188+ if isinstance (unknown_arg_format , Iterable ) and not isinstance (
189+ unknown_arg_format , str
190+ ):
191+ arg_format = cast (Sequence [ArgFormat ], unknown_arg_format )
192+ else :
193+ arg_format = (unknown_arg_format ,)
191194
192195 segments : list [TextComponent ] = []
193196 for format_segment in arg_format :
0 commit comments