From 8456fa8e1314be77b37e586970a9006f4b6bb68d Mon Sep 17 00:00:00 2001 From: antazoey Date: Mon, 21 Oct 2024 09:58:04 -0500 Subject: [PATCH] fix: use already set level as default (#2330) --- src/ape/cli/options.py | 19 +++++++++++-------- tests/functional/test_cli.py | 12 ++++++++++++ tests/functional/test_logging.py | 2 +- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/ape/cli/options.py b/src/ape/cli/options.py index 01f3c5d58a..d1e3ec1f06 100644 --- a/src/ape/cli/options.py +++ b/src/ape/cli/options.py @@ -61,7 +61,7 @@ def abort(msg: str, base_error: Optional[Exception] = None) -> NoReturn: def verbosity_option( cli_logger: Optional[ApeLogger] = None, - default: Union[str, int, LogLevel] = DEFAULT_LOG_LEVEL, + default: Optional[Union[str, int, LogLevel]] = None, callback: Optional[Callable] = None, **kwargs, ) -> Callable: @@ -80,6 +80,7 @@ def verbosity_option( click option """ _logger = cli_logger or logger + default = logger.level if default is None else default kwarguments = _create_verbosity_kwargs( _logger=_logger, default=default, callback=callback, **kwargs ) @@ -88,11 +89,12 @@ def verbosity_option( def _create_verbosity_kwargs( _logger: Optional[ApeLogger] = None, - default: Union[str, int, LogLevel] = DEFAULT_LOG_LEVEL, + default: Optional[Union[str, int, LogLevel]] = None, callback: Optional[Callable] = None, **kwargs, ) -> dict: - cli_logger = _logger or logger + default = logger.level if default is None else default + ape_logger = _logger or logger def set_level(ctx, param, value): if isinstance(value, str): @@ -103,11 +105,11 @@ def set_level(ctx, param, value): if callback is not None: value = callback(ctx, param, value) - if cli_logger._did_parse_sys_argv: + if ape_logger._did_parse_sys_argv: # Changing mid-session somehow (tests?) - cli_logger.set_level(value) + ape_logger.set_level(value) else: - cli_logger._load_from_sys_argv(default=value) + ape_logger._load_from_sys_argv(default=value) level_names = [lvl.name for lvl in LogLevel] names_str = f"{', '.join(level_names[:-1])}, or {level_names[-1]}" @@ -124,7 +126,7 @@ def set_level(ctx, param, value): def ape_cli_context( - default_log_level: Union[str, int, LogLevel] = DEFAULT_LOG_LEVEL, + default_log_level: Optional[Union[str, int, LogLevel]] = None, obj_type: type = ApeCliContextObject, ) -> Callable: """ @@ -133,7 +135,7 @@ def ape_cli_context( such as logging or accessing managers. Args: - default_log_level (str | int | :class:`~ape.logging.LogLevel`): The log-level + default_log_level (str | int | :class:`~ape.logging.LogLevel` | None): The log-level value to pass to :meth:`~ape.cli.options.verbosity_option`. obj_type (Type): The context object type. Defaults to :class:`~ape.cli.options.ApeCliContextObject`. Sub-class @@ -144,6 +146,7 @@ def ape_cli_context( Returns: click option """ + default_log_level = logger.level if default_log_level is None else default_log_level def decorator(f): f = verbosity_option(logger, default=default_log_level)(f) diff --git a/tests/functional/test_cli.py b/tests/functional/test_cli.py index 00c702bf64..bde52e3ac5 100644 --- a/tests/functional/test_cli.py +++ b/tests/functional/test_cli.py @@ -454,6 +454,18 @@ def cmd(): assert verbosity_parameter.default == level +def test_verbosity_option_uses_logger_level_as_default(runner): + @click.command() + @verbosity_option(default=None) + def cmd(): + click.echo(f"LogLevel={logger.level}") + pass + + with logger.at_level(LogLevel.DEBUG): + result = runner.invoke(cmd) + assert "LogLevel=10" in result.output + + def test_account_prompt_name(): """ It is very important for this class to have the `name` attribute, diff --git a/tests/functional/test_logging.py b/tests/functional/test_logging.py index 512a0c12fe..72bd0dd313 100644 --- a/tests/functional/test_logging.py +++ b/tests/functional/test_logging.py @@ -69,7 +69,7 @@ def test_success(simple_runner): # this test also ensures that we get SUCCESS logs # without having to specify verbosity @group_for_testing.command() - @ape_cli_context() + @ape_cli_context(default_log_level=LogLevel.INFO.value) def cmd(cli_ctx): cli_ctx.logger.success("this is a test")