"""Verbosity type for ``-v``/``-q`` count flags with log level computation.Inspired by `clap-verbosity-flag <https://docs.rs/clap-verbosity-flag>`_ from theRust/clap ecosystem, which is maintained by the clap maintainers and provides thesame pattern for Rust CLIs."""from__future__importannotationsimportloggingfromdataclassesimportdataclassfromtyping_extensionsimportAnnotatedfrom..importconffrom..confimportUseCounterAction# Shared mutex group: at most one of --verbose / --quiet can be specified._verbosity_mutex:object=conf.create_mutex_group(required=False,title="verbosity",)
[docs]@dataclass(frozen=True)classVerbosity:"""Parsed verbosity counters from ``-v``/``-q`` CLI flags. Drop into any tyro CLI struct to get standard ``--verbose``/``-v`` and ``--quiet``/``-q`` count flags that map to Python :mod:`logging` levels. The two flags are mutually exclusive. Example:: import logging import tyro from dataclasses import dataclass, field from tyro.extras import Verbosity @dataclass class Args: verbosity: Verbosity = Verbosity() args = tyro.cli(Args) logging.basicConfig(level=args.verbosity.log_level()) Default level mapping (baseline: ``logging.WARNING``): .. code-block:: text (none) → WARNING (30) -v → INFO (20) -vv → DEBUG (10) -q → ERROR (40) -qq → CRITICAL (50) Values are clamped to the ``DEBUG``..``CRITICAL`` range. """verbose:Annotated[UseCounterAction[int],conf.arg(aliases=["-v"],help="Increase log verbosity."),_verbosity_mutex,]=0quiet:Annotated[UseCounterAction[int],conf.arg(aliases=["-q"],help="Decrease log verbosity."),_verbosity_mutex,]=0
[docs]deflog_level(self,*,default:int=logging.WARNING)->int:"""Compute the effective logging level, clamped to ``DEBUG``..``CRITICAL``. Formula: ``default + (quiet - verbose) * 10``. Args: default: Baseline logging level. Defaults to ``logging.WARNING``. Returns: An integer logging level suitable for :func:`logging.basicConfig`. """level=default+(self.quiet-self.verbose)*10returnmax(logging.DEBUG,min(logging.CRITICAL,level))