diff --git a/src/exposed/click.py b/src/exposed/click.py index e48375d513bf57db92fee4781893cd139f333e3f..5897272e7cad8a7d10ea789b66f09218a76f0189 100644 --- a/src/exposed/click.py +++ b/src/exposed/click.py @@ -868,3 +868,25 @@ def config_group( return group_wrapper return group_decorator + + +def log_parameters( + logger_handle: logging.Logger, ignore: tuple[str] | None = None +): + """Logs the click parameters with the logging module. + + Parameters + ---------- + logger_handle : object + The logger handle to write debug information into. + ignore : tuple + The keys in ignore will not be logged. + """ + ignore = ignore or tuple() + ctx = click.get_current_context() + # do not sort the ctx.params dict. The insertion order is kept in Python 3 + # and is useful (but not necessary so works on Python 2 too). + for k, v in ctx.params.items(): + if k in ignore: + continue + logger_handle.debug("%s: %s", k, v) diff --git a/tests/test_click.py b/tests/test_click.py index 31c1aae190b742e615b35f9a5c16fd2f6ccd5d25..e47b4bbbb32877ff0b093b884a3c95b5fd2f0567 100644 --- a/tests/test_click.py +++ b/tests/test_click.py @@ -9,6 +9,7 @@ from exposed.click import ( AliasedGroup, ConfigCommand, ResourceOption, + log_parameters, verbosity_option, ) @@ -293,3 +294,47 @@ def test_resource_option(): runner = CliRunner() result = runner.invoke(cli3, ["-a", "tests.data.basic_config"]) assert result.exit_code == 0 + + +def test_log_parameter(): + # Fake logger that checks if log_parameters accesses it + class DummyLogger: + def __init__(self): + self.accessed = False + + def debug(self, str, k, v): + self.accessed = True + + @click.command() + @click.option( + "-a", + "--a", + ) + def cli_log(a): + dummy_logger = DummyLogger() + log_parameters(dummy_logger) + assert dummy_logger.accessed + + runner = CliRunner() + result = runner.invoke(cli_log, ["-a", "aparam"]) + assert result.exit_code == 0 + + +def test_log_parameter_with_ignore(): + # Fake logger that ensures that the parameter 'a' is ignored + class DummyLogger: + def debug(self, str, k, v): + assert "a" not in k + + @click.command() + @click.option("-a", "--a") + @click.option( + "-b", + "--b", + ) + def cli_log(a, b): + log_parameters(DummyLogger(), ignore=("a")) + + runner = CliRunner() + result = runner.invoke(cli_log, ["-a", "aparam", "-b", "bparam"]) + assert result.exit_code == 0