Coverage for typer/core.py: 100%

265 statements  

« prev     ^ index     » next       coverage.py v7.5.4, created at 2024-06-24 00:17 +0000

1import errno 1hbfaecdg

2import inspect 1hbfaecdg

3import os 1hbfaecdg

4import sys 1hbfaecdg

5from enum import Enum 1hbfaecdg

6from gettext import gettext as _ 1hbfaecdg

7from typing import ( 1hbfaecdg

8 Any, 

9 Callable, 

10 Dict, 

11 List, 

12 MutableMapping, 

13 Optional, 

14 Sequence, 

15 TextIO, 

16 Tuple, 

17 Union, 

18 cast, 

19) 

20 

21import click 1hbfaecdg

22import click.core 1hbfaecdg

23import click.formatting 1hbfaecdg

24import click.parser 1hbfaecdg

25import click.shell_completion 1hbfaecdg

26import click.types 1hbfaecdg

27import click.utils 1hbfaecdg

28 

29if sys.version_info >= (3, 8): 1hbfaecdg

30 from typing import Literal 1bfaecdg

31else: 

32 from typing_extensions import Literal 1h

33 

34try: 1hbfaecdg

35 import rich 1hbfaecdg

36 

37 from . import rich_utils 1hbfaecdg

38 

39except ImportError: # pragma: no cover 

40 rich = None # type: ignore 

41 

42MarkupMode = Literal["markdown", "rich", None] 1hbfaecdg

43 

44 

45# Copy from click.parser._split_opt 

46def _split_opt(opt: str) -> Tuple[str, str]: 1hbfaecdg

47 first = opt[:1] 1hbfaecdg

48 if first.isalnum(): 1hbfaecdg

49 return "", opt 1hbfaecdg

50 if opt[1:2] == first: 1hbfaecdg

51 return opt[:2], opt[2:] 1hbfaecdg

52 return first, opt[1:] 1hbfaecdg

53 

54 

55def _typer_param_setup_autocompletion_compat( 1bfaecdg

56 self: click.Parameter, 

57 *, 

58 autocompletion: Optional[ 

59 Callable[[click.Context, List[str], str], List[Union[Tuple[str, str], str]]] 

60 ] = None, 

61) -> None: 

62 if autocompletion is not None and self._custom_shell_complete is None: 1hbfaecdg

63 import warnings 1hbfaecdg

64 

65 warnings.warn( 1hbfaecdg

66 "'autocompletion' is renamed to 'shell_complete'. The old name is" 

67 " deprecated and will be removed in Click 8.1. See the docs about" 

68 " 'Parameter' for information about new behavior.", 

69 DeprecationWarning, 

70 stacklevel=2, 

71 ) 

72 

73 def compat_autocompletion( 1bfaecdg

74 ctx: click.Context, param: click.core.Parameter, incomplete: str 

75 ) -> List["click.shell_completion.CompletionItem"]: 

76 from click.shell_completion import CompletionItem 1hbfaecdg

77 

78 out = [] 1hbfaecdg

79 

80 for c in autocompletion(ctx, [], incomplete): 1hbfaecdg

81 if isinstance(c, tuple): 1hbfaecdg

82 use_completion = CompletionItem(c[0], help=c[1]) 1hbfaecdg

83 else: 

84 assert isinstance(c, str) 1hbfaecdg

85 use_completion = CompletionItem(c) 1hbfaecdg

86 

87 if use_completion.value.startswith(incomplete): 1hbfaecdg

88 out.append(use_completion) 1hbfaecdg

89 

90 return out 1hbfaecdg

91 

92 self._custom_shell_complete = compat_autocompletion 1hbfaecdg

93 

94 

95def _get_default_string( 1bfaecdg

96 obj: Union["TyperArgument", "TyperOption"], 

97 *, 

98 ctx: click.Context, 

99 show_default_is_str: bool, 

100 default_value: Union[List[Any], Tuple[Any, ...], str, Callable[..., Any], Any], 

101) -> str: 

102 # Extracted from click.core.Option.get_help_record() to be reused by 

103 # rich_utils avoiding RegEx hacks 

104 if show_default_is_str: 1hbfaecdg

105 default_string = f"({obj.show_default})" 1hbfaecdg

106 elif isinstance(default_value, (list, tuple)): 1hbfaecdg

107 default_string = ", ".join( 1hbfaecdg

108 _get_default_string( 

109 obj, ctx=ctx, show_default_is_str=show_default_is_str, default_value=d 

110 ) 

111 for d in default_value 

112 ) 

113 elif isinstance(default_value, Enum): 1hbfaecdg

114 default_string = str(default_value.value) 1hbfaecdg

115 elif inspect.isfunction(default_value): 1hbfaecdg

116 default_string = _("(dynamic)") 1hbfaecdg

117 elif isinstance(obj, TyperOption) and obj.is_bool_flag and obj.secondary_opts: 1hbfaecdg

118 # For boolean flags that have distinct True/False opts, 

119 # use the opt without prefix instead of the value. 

120 # Typer override, original commented 

121 # default_string = click.parser.split_opt( 

122 # (self.opts if self.default else self.secondary_opts)[0] 

123 # )[1] 

124 if obj.default: 1hbfaecdg

125 if obj.opts: 1hbfaecdg

126 default_string = _split_opt(obj.opts[0])[1] 1hbfaecdg

127 else: 

128 default_string = str(default_value) 1hbfaecdg

129 else: 

130 default_string = _split_opt(obj.secondary_opts[0])[1] 1hbfaecdg

131 # Typer override end 

132 elif ( 1bacd

133 isinstance(obj, TyperOption) 

134 and obj.is_bool_flag 

135 and not obj.secondary_opts 

136 and not default_value 

137 ): 

138 default_string = "" 1hbfaecdg

139 else: 

140 default_string = str(default_value) 1hbfaecdg

141 return default_string 1hbfaecdg

142 

143 

144def _extract_default_help_str( 1bfaecdg

145 obj: Union["TyperArgument", "TyperOption"], *, ctx: click.Context 

146) -> Optional[Union[Any, Callable[[], Any]]]: 

147 # Extracted from click.core.Option.get_help_record() to be reused by 

148 # rich_utils avoiding RegEx hacks 

149 # Temporarily enable resilient parsing to avoid type casting 

150 # failing for the default. Might be possible to extend this to 

151 # help formatting in general. 

152 resilient = ctx.resilient_parsing 1hbfaecdg

153 ctx.resilient_parsing = True 1hbfaecdg

154 

155 try: 1hbfaecdg

156 default_value = obj.get_default(ctx, call=False) 1hbfaecdg

157 finally: 

158 ctx.resilient_parsing = resilient 1hbfaecdg

159 return default_value 1hbfaecdg

160 

161 

162def _main( 1bfaecdg

163 self: click.Command, 

164 *, 

165 args: Optional[Sequence[str]] = None, 

166 prog_name: Optional[str] = None, 

167 complete_var: Optional[str] = None, 

168 standalone_mode: bool = True, 

169 windows_expand_args: bool = True, 

170 **extra: Any, 

171) -> Any: 

172 # Typer override, duplicated from click.main() to handle custom rich exceptions 

173 # Verify that the environment is configured correctly, or reject 

174 # further execution to avoid a broken script. 

175 if args is None: 1hbfaecdg

176 args = sys.argv[1:] 1hbfaecdg

177 

178 # Covered in Click tests 

179 if os.name == "nt" and windows_expand_args: # pragma: no cover 1hbfaecdg

180 args = click.utils._expand_args(args) 1ae

181 else: 

182 args = list(args) 1hbfaecdg

183 

184 if prog_name is None: 1hbfaecdg

185 prog_name = click.utils._detect_program_name() 1hbfaecdg

186 

187 # Process shell completion requests and exit early. 

188 self._main_shell_completion(extra, prog_name, complete_var) 1hbfaecdg

189 

190 try: 1hbfaecdg

191 try: 1hbfaecdg

192 with self.make_context(prog_name, args, **extra) as ctx: 1hbfaecdg

193 rv = self.invoke(ctx) 1hbfaecdg

194 if not standalone_mode: 1hbfaecdg

195 return rv 1hbfaecdg

196 # it's not safe to `ctx.exit(rv)` here! 

197 # note that `rv` may actually contain data like "1" which 

198 # has obvious effects 

199 # more subtle case: `rv=[None, None]` can come out of 

200 # chained commands which all returned `None` -- so it's not 

201 # even always obvious that `rv` indicates success/failure 

202 # by its truthiness/falsiness 

203 ctx.exit() 1hbfaecdg

204 except (EOFError, KeyboardInterrupt) as e: 1hbfaecdg

205 click.echo(file=sys.stderr) 1hbfaecdg

206 raise click.Abort() from e 1hbfaecdg

207 except click.ClickException as e: 1hbfaecdg

208 if not standalone_mode: 1hbfaecdg

209 raise 1hbfaecdg

210 # Typer override 

211 if rich: 1hbfaecdg

212 rich_utils.rich_format_error(e) 1hbfaecdg

213 else: 

214 e.show() 1hbfaecdg

215 # Typer override end 

216 sys.exit(e.exit_code) 1hbfaecdg

217 except OSError as e: 1hbfaecdg

218 if e.errno == errno.EPIPE: 1hbfaecdg

219 sys.stdout = cast(TextIO, click.utils.PacifyFlushWrapper(sys.stdout)) 1hbfaecdg

220 sys.stderr = cast(TextIO, click.utils.PacifyFlushWrapper(sys.stderr)) 1hbfaecdg

221 sys.exit(1) 1hbfaecdg

222 else: 

223 raise 1hbfaecdg

224 except click.exceptions.Exit as e: 1hbfaecdg

225 if standalone_mode: 1hbfaecdg

226 sys.exit(e.exit_code) 1hbfaecdg

227 else: 

228 # in non-standalone mode, return the exit code 

229 # note that this is only reached if `self.invoke` above raises 

230 # an Exit explicitly -- thus bypassing the check there which 

231 # would return its result 

232 # the results of non-standalone execution may therefore be 

233 # somewhat ambiguous: if there are codepaths which lead to 

234 # `ctx.exit(1)` and to `return 1`, the caller won't be able to 

235 # tell the difference between the two 

236 return e.exit_code 1hbfaecdg

237 except click.Abort: 1hbfaecdg

238 if not standalone_mode: 1hbfaecdg

239 raise 1hbfaecdg

240 # Typer override 

241 if rich: 1hbfaecdg

242 rich_utils.rich_abort_error() 1hbfaecdg

243 else: 

244 click.echo(_("Aborted!"), file=sys.stderr) 1hbfaecdg

245 # Typer override end 

246 sys.exit(1) 1hbfaecdg

247 

248 

249class TyperArgument(click.core.Argument): 1hbfaecdg

250 def __init__( 1bfaecdg

251 self, 

252 *, 

253 # Parameter 

254 param_decls: List[str], 

255 type: Optional[Any] = None, 

256 required: Optional[bool] = None, 

257 default: Optional[Any] = None, 

258 callback: Optional[Callable[..., Any]] = None, 

259 nargs: Optional[int] = None, 

260 metavar: Optional[str] = None, 

261 expose_value: bool = True, 

262 is_eager: bool = False, 

263 envvar: Optional[Union[str, List[str]]] = None, 

264 shell_complete: Optional[ 

265 Callable[ 

266 [click.Context, click.Parameter, str], 

267 Union[List["click.shell_completion.CompletionItem"], List[str]], 

268 ] 

269 ] = None, 

270 autocompletion: Optional[Callable[..., Any]] = None, 

271 # TyperArgument 

272 show_default: Union[bool, str] = True, 

273 show_choices: bool = True, 

274 show_envvar: bool = True, 

275 help: Optional[str] = None, 

276 hidden: bool = False, 

277 # Rich settings 

278 rich_help_panel: Union[str, None] = None, 

279 ): 

280 self.help = help 1hbfaecdg

281 self.show_default = show_default 1hbfaecdg

282 self.show_choices = show_choices 1hbfaecdg

283 self.show_envvar = show_envvar 1hbfaecdg

284 self.hidden = hidden 1hbfaecdg

285 self.rich_help_panel = rich_help_panel 1hbfaecdg

286 

287 super().__init__( 1hbfaecdg

288 param_decls=param_decls, 

289 type=type, 

290 required=required, 

291 default=default, 

292 callback=callback, 

293 nargs=nargs, 

294 metavar=metavar, 

295 expose_value=expose_value, 

296 is_eager=is_eager, 

297 envvar=envvar, 

298 shell_complete=shell_complete, 

299 ) 

300 _typer_param_setup_autocompletion_compat(self, autocompletion=autocompletion) 1hbfaecdg

301 

302 def _get_default_string( 1bfaecdg

303 self, 

304 *, 

305 ctx: click.Context, 

306 show_default_is_str: bool, 

307 default_value: Union[List[Any], Tuple[Any, ...], str, Callable[..., Any], Any], 

308 ) -> str: 

309 return _get_default_string( 1hbfaecdg

310 self, 

311 ctx=ctx, 

312 show_default_is_str=show_default_is_str, 

313 default_value=default_value, 

314 ) 

315 

316 def _extract_default_help_str( 1bfaecdg

317 self, *, ctx: click.Context 

318 ) -> Optional[Union[Any, Callable[[], Any]]]: 

319 return _extract_default_help_str(self, ctx=ctx) 1hbfaecdg

320 

321 def get_help_record(self, ctx: click.Context) -> Optional[Tuple[str, str]]: 1hbfaecdg

322 # Modified version of click.core.Option.get_help_record() 

323 # to support Arguments 

324 if self.hidden: 1hbfaecdg

325 return None 1hbfaecdg

326 name = self.make_metavar() 1hbfaecdg

327 help = self.help or "" 1hbfaecdg

328 extra = [] 1hbfaecdg

329 if self.show_envvar: 1hbfaecdg

330 envvar = self.envvar 1hbfaecdg

331 # allow_from_autoenv is currently not supported in Typer for CLI Arguments 

332 if envvar is not None: 1hbfaecdg

333 var_str = ( 1bfaecdg

334 ", ".join(str(d) for d in envvar) 

335 if isinstance(envvar, (list, tuple)) 

336 else envvar 

337 ) 

338 extra.append(f"env var: {var_str}") 1hbfaecdg

339 

340 # Typer override: 

341 # Extracted to _extract_default_help_str() to allow re-using it in rich_utils 

342 default_value = self._extract_default_help_str(ctx=ctx) 1hbfaecdg

343 # Typer override end 

344 

345 show_default_is_str = isinstance(self.show_default, str) 1hbfaecdg

346 

347 if show_default_is_str or ( 1hbfaecdg

348 default_value is not None and (self.show_default or ctx.show_default) 

349 ): 

350 # Typer override: 

351 # Extracted to _get_default_string() to allow re-using it in rich_utils 

352 default_string = self._get_default_string( 1hbfaecdg

353 ctx=ctx, 

354 show_default_is_str=show_default_is_str, 

355 default_value=default_value, 

356 ) 

357 # Typer override end 

358 if default_string: 1hbfaecdg

359 extra.append(_("default: {default}").format(default=default_string)) 1hbfaecdg

360 if self.required: 1hbfaecdg

361 extra.append(_("required")) 1hbfaecdg

362 if extra: 1hbfaecdg

363 extra_str = ";".join(extra) 1hbfaecdg

364 help = f"{help} [{extra_str}]" if help else f"[{extra_str}]" 1hbfaecdg

365 return name, help 1hbfaecdg

366 

367 def make_metavar(self) -> str: 1hbfaecdg

368 # Modified version of click.core.Argument.make_metavar() 

369 # to include Argument name 

370 if self.metavar is not None: 1hbfaecdg

371 return self.metavar 1hbfaecdg

372 var = (self.name or "").upper() 1hbfaecdg

373 if not self.required: 1hbfaecdg

374 var = f"[{var}]" 1hbfaecdg

375 type_var = self.type.get_metavar(self) 1hbfaecdg

376 if type_var: 1hbfaecdg

377 var += f":{type_var}" 1hbfaecdg

378 if self.nargs != 1: 1hbfaecdg

379 var += "..." 1hbfaecdg

380 return var 1hbfaecdg

381 

382 

383class TyperOption(click.core.Option): 1hbfaecdg

384 def __init__( 1bfaecdg

385 self, 

386 *, 

387 # Parameter 

388 param_decls: List[str], 

389 type: Optional[Union[click.types.ParamType, Any]] = None, 

390 required: Optional[bool] = None, 

391 default: Optional[Any] = None, 

392 callback: Optional[Callable[..., Any]] = None, 

393 nargs: Optional[int] = None, 

394 metavar: Optional[str] = None, 

395 expose_value: bool = True, 

396 is_eager: bool = False, 

397 envvar: Optional[Union[str, List[str]]] = None, 

398 shell_complete: Optional[ 

399 Callable[ 

400 [click.Context, click.Parameter, str], 

401 Union[List["click.shell_completion.CompletionItem"], List[str]], 

402 ] 

403 ] = None, 

404 autocompletion: Optional[Callable[..., Any]] = None, 

405 # Option 

406 show_default: Union[bool, str] = False, 

407 prompt: Union[bool, str] = False, 

408 confirmation_prompt: Union[bool, str] = False, 

409 prompt_required: bool = True, 

410 hide_input: bool = False, 

411 is_flag: Optional[bool] = None, 

412 flag_value: Optional[Any] = None, 

413 multiple: bool = False, 

414 count: bool = False, 

415 allow_from_autoenv: bool = True, 

416 help: Optional[str] = None, 

417 hidden: bool = False, 

418 show_choices: bool = True, 

419 show_envvar: bool = False, 

420 # Rich settings 

421 rich_help_panel: Union[str, None] = None, 

422 ): 

423 super().__init__( 1hbfaecdg

424 param_decls=param_decls, 

425 type=type, 

426 required=required, 

427 default=default, 

428 callback=callback, 

429 nargs=nargs, 

430 metavar=metavar, 

431 expose_value=expose_value, 

432 is_eager=is_eager, 

433 envvar=envvar, 

434 show_default=show_default, 

435 prompt=prompt, 

436 confirmation_prompt=confirmation_prompt, 

437 hide_input=hide_input, 

438 is_flag=is_flag, 

439 flag_value=flag_value, 

440 multiple=multiple, 

441 count=count, 

442 allow_from_autoenv=allow_from_autoenv, 

443 help=help, 

444 hidden=hidden, 

445 show_choices=show_choices, 

446 show_envvar=show_envvar, 

447 prompt_required=prompt_required, 

448 shell_complete=shell_complete, 

449 ) 

450 _typer_param_setup_autocompletion_compat(self, autocompletion=autocompletion) 1hbfaecdg

451 self.rich_help_panel = rich_help_panel 1hbfaecdg

452 

453 def _get_default_string( 1bfaecdg

454 self, 

455 *, 

456 ctx: click.Context, 

457 show_default_is_str: bool, 

458 default_value: Union[List[Any], Tuple[Any, ...], str, Callable[..., Any], Any], 

459 ) -> str: 

460 return _get_default_string( 1hbfaecdg

461 self, 

462 ctx=ctx, 

463 show_default_is_str=show_default_is_str, 

464 default_value=default_value, 

465 ) 

466 

467 def _extract_default_help_str( 1bfaecdg

468 self, *, ctx: click.Context 

469 ) -> Optional[Union[Any, Callable[[], Any]]]: 

470 return _extract_default_help_str(self, ctx=ctx) 1hbfaecdg

471 

472 def get_help_record(self, ctx: click.Context) -> Optional[Tuple[str, str]]: 1hbfaecdg

473 # Duplicate all of Click's logic only to modify a single line, to allow boolean 

474 # flags with only names for False values as it's currently supported by Typer 

475 # Ref: https://typer.tiangolo.com/tutorial/parameter-types/bool/#only-names-for-false 

476 if self.hidden: 1hbfaecdg

477 return None 1hbfaecdg

478 

479 any_prefix_is_slash = False 1hbfaecdg

480 

481 def _write_opts(opts: Sequence[str]) -> str: 1hbfaecdg

482 nonlocal any_prefix_is_slash 

483 

484 rv, any_slashes = click.formatting.join_options(opts) 1hbfaecdg

485 

486 if any_slashes: 1hbfaecdg

487 any_prefix_is_slash = True 1hbfaecdg

488 

489 if not self.is_flag and not self.count: 1hbfaecdg

490 rv += f" {self.make_metavar()}" 1hbfaecdg

491 

492 return rv 1hbfaecdg

493 

494 rv = [_write_opts(self.opts)] 1hbfaecdg

495 

496 if self.secondary_opts: 1hbfaecdg

497 rv.append(_write_opts(self.secondary_opts)) 1hbfaecdg

498 

499 help = self.help or "" 1hbfaecdg

500 extra = [] 1hbfaecdg

501 

502 if self.show_envvar: 1hbfaecdg

503 envvar = self.envvar 1hbfaecdg

504 

505 if envvar is None: 1hbfaecdg

506 if ( 1bacd

507 self.allow_from_autoenv 

508 and ctx.auto_envvar_prefix is not None 

509 and self.name is not None 

510 ): 

511 envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" 1hbfaecdg

512 

513 if envvar is not None: 1hbfaecdg

514 var_str = ( 1bfaecdg

515 envvar 

516 if isinstance(envvar, str) 

517 else ", ".join(str(d) for d in envvar) 

518 ) 

519 extra.append(_("env var: {var}").format(var=var_str)) 1hbfaecdg

520 

521 # Typer override: 

522 # Extracted to _extract_default() to allow re-using it in rich_utils 

523 default_value = self._extract_default_help_str(ctx=ctx) 1hbfaecdg

524 # Typer override end 

525 

526 show_default_is_str = isinstance(self.show_default, str) 1hbfaecdg

527 

528 if show_default_is_str or ( 1hbfaecdg

529 default_value is not None and (self.show_default or ctx.show_default) 

530 ): 

531 # Typer override: 

532 # Extracted to _get_default_string() to allow re-using it in rich_utils 

533 default_string = self._get_default_string( 1hbfaecdg

534 ctx=ctx, 

535 show_default_is_str=show_default_is_str, 

536 default_value=default_value, 

537 ) 

538 # Typer override end 

539 if default_string: 1hbfaecdg

540 extra.append(_("default: {default}").format(default=default_string)) 1hbfaecdg

541 

542 if isinstance(self.type, click.types._NumberRangeBase): 1hbfaecdg

543 range_str = self.type._describe_range() 1hbfaecdg

544 

545 if range_str: 1hbfaecdg

546 extra.append(range_str) 1hbfaecdg

547 

548 if self.required: 1hbfaecdg

549 extra.append(_("required")) 1hbfaecdg

550 

551 if extra: 1hbfaecdg

552 extra_str = "; ".join(extra) 1hbfaecdg

553 help = f"{help} [{extra_str}]" if help else f"[{extra_str}]" 1hbfaecdg

554 

555 return ("; " if any_prefix_is_slash else " / ").join(rv), help 1hbfaecdg

556 

557 

558def _typer_format_options( 1bfaecdg

559 self: click.core.Command, *, ctx: click.Context, formatter: click.HelpFormatter 

560) -> None: 

561 args = [] 1hbfaecdg

562 opts = [] 1hbfaecdg

563 for param in self.get_params(ctx): 1hbfaecdg

564 rv = param.get_help_record(ctx) 1hbfaecdg

565 if rv is not None: 1hbfaecdg

566 if param.param_type_name == "argument": 1hbfaecdg

567 args.append(rv) 1hbfaecdg

568 elif param.param_type_name == "option": 1hbfaecdg

569 opts.append(rv) 1hbfaecdg

570 

571 if args: 1hbfaecdg

572 with formatter.section(_("Arguments")): 1hbfaecdg

573 formatter.write_dl(args) 1hbfaecdg

574 if opts: 1hbfaecdg

575 with formatter.section(_("Options")): 1hbfaecdg

576 formatter.write_dl(opts) 1hbfaecdg

577 

578 

579def _typer_main_shell_completion( 1bfaecdg

580 self: click.core.Command, 

581 *, 

582 ctx_args: MutableMapping[str, Any], 

583 prog_name: str, 

584 complete_var: Optional[str] = None, 

585) -> None: 

586 if complete_var is None: 1hbfaecdg

587 complete_var = f"_{prog_name}_COMPLETE".replace("-", "_").upper() 1hbfaecdg

588 

589 instruction = os.environ.get(complete_var) 1hbfaecdg

590 

591 if not instruction: 1hbfaecdg

592 return 1hbfaecdg

593 

594 from .completion import shell_complete 1hbfaecdg

595 

596 rv = shell_complete(self, ctx_args, prog_name, complete_var, instruction) 1hbfaecdg

597 sys.exit(rv) 1hbfaecdg

598 

599 

600class TyperCommand(click.core.Command): 1hbfaecdg

601 def __init__( 1bfaecdg

602 self, 

603 name: Optional[str], 

604 *, 

605 context_settings: Optional[Dict[str, Any]] = None, 

606 callback: Optional[Callable[..., Any]] = None, 

607 params: Optional[List[click.Parameter]] = None, 

608 help: Optional[str] = None, 

609 epilog: Optional[str] = None, 

610 short_help: Optional[str] = None, 

611 options_metavar: Optional[str] = "[OPTIONS]", 

612 add_help_option: bool = True, 

613 no_args_is_help: bool = False, 

614 hidden: bool = False, 

615 deprecated: bool = False, 

616 # Rich settings 

617 rich_markup_mode: MarkupMode = None, 

618 rich_help_panel: Union[str, None] = None, 

619 ) -> None: 

620 super().__init__( 1hbfaecdg

621 name=name, 

622 context_settings=context_settings, 

623 callback=callback, 

624 params=params, 

625 help=help, 

626 epilog=epilog, 

627 short_help=short_help, 

628 options_metavar=options_metavar, 

629 add_help_option=add_help_option, 

630 no_args_is_help=no_args_is_help, 

631 hidden=hidden, 

632 deprecated=deprecated, 

633 ) 

634 self.rich_markup_mode: MarkupMode = rich_markup_mode 1hbfaecdg

635 self.rich_help_panel = rich_help_panel 1hbfaecdg

636 

637 def format_options( 1bfaecdg

638 self, ctx: click.Context, formatter: click.HelpFormatter 

639 ) -> None: 

640 _typer_format_options(self, ctx=ctx, formatter=formatter) 1hbfaecdg

641 

642 def _main_shell_completion( 1bfaecdg

643 self, 

644 ctx_args: MutableMapping[str, Any], 

645 prog_name: str, 

646 complete_var: Optional[str] = None, 

647 ) -> None: 

648 _typer_main_shell_completion( 1hbfaecdg

649 self, ctx_args=ctx_args, prog_name=prog_name, complete_var=complete_var 

650 ) 

651 

652 def main( 1bfaecdg

653 self, 

654 args: Optional[Sequence[str]] = None, 

655 prog_name: Optional[str] = None, 

656 complete_var: Optional[str] = None, 

657 standalone_mode: bool = True, 

658 windows_expand_args: bool = True, 

659 **extra: Any, 

660 ) -> Any: 

661 return _main( 1hbfaecdg

662 self, 

663 args=args, 

664 prog_name=prog_name, 

665 complete_var=complete_var, 

666 standalone_mode=standalone_mode, 

667 windows_expand_args=windows_expand_args, 

668 **extra, 

669 ) 

670 

671 def format_help(self, ctx: click.Context, formatter: click.HelpFormatter) -> None: 1hbfaecdg

672 if not rich: 1hbfaecdg

673 return super().format_help(ctx, formatter) 1hbfaecdg

674 return rich_utils.rich_format_help( 1hbfaecdg

675 obj=self, 

676 ctx=ctx, 

677 markup_mode=self.rich_markup_mode, 

678 ) 

679 

680 

681class TyperGroup(click.core.Group): 1hbfaecdg

682 def __init__( 1bfaecdg

683 self, 

684 *, 

685 name: Optional[str] = None, 

686 commands: Optional[ 

687 Union[Dict[str, click.Command], Sequence[click.Command]] 

688 ] = None, 

689 # Rich settings 

690 rich_markup_mode: MarkupMode = None, 

691 rich_help_panel: Union[str, None] = None, 

692 **attrs: Any, 

693 ) -> None: 

694 super().__init__(name=name, commands=commands, **attrs) 1hbfaecdg

695 self.rich_markup_mode: MarkupMode = rich_markup_mode 1hbfaecdg

696 self.rich_help_panel = rich_help_panel 1hbfaecdg

697 

698 def format_options( 1bfaecdg

699 self, ctx: click.Context, formatter: click.HelpFormatter 

700 ) -> None: 

701 _typer_format_options(self, ctx=ctx, formatter=formatter) 1hbfaecdg

702 self.format_commands(ctx, formatter) 1hbfaecdg

703 

704 def _main_shell_completion( 1bfaecdg

705 self, 

706 ctx_args: MutableMapping[str, Any], 

707 prog_name: str, 

708 complete_var: Optional[str] = None, 

709 ) -> None: 

710 _typer_main_shell_completion( 1hbfaecdg

711 self, ctx_args=ctx_args, prog_name=prog_name, complete_var=complete_var 

712 ) 

713 

714 def main( 1bfaecdg

715 self, 

716 args: Optional[Sequence[str]] = None, 

717 prog_name: Optional[str] = None, 

718 complete_var: Optional[str] = None, 

719 standalone_mode: bool = True, 

720 windows_expand_args: bool = True, 

721 **extra: Any, 

722 ) -> Any: 

723 return _main( 1hbfaecdg

724 self, 

725 args=args, 

726 prog_name=prog_name, 

727 complete_var=complete_var, 

728 standalone_mode=standalone_mode, 

729 windows_expand_args=windows_expand_args, 

730 **extra, 

731 ) 

732 

733 def format_help(self, ctx: click.Context, formatter: click.HelpFormatter) -> None: 1hbfaecdg

734 if not rich: 1hbfaecdg

735 return super().format_help(ctx, formatter) 1hbfaecdg

736 return rich_utils.rich_format_help( 1hbfaecdg

737 obj=self, 

738 ctx=ctx, 

739 markup_mode=self.rich_markup_mode, 

740 )