From ccdf3c2ec22d59fffa7352d0b92d73a989248f9f Mon Sep 17 00:00:00 2001
From: Andre Mayoraz <andre.mayoraz@idiap.ch>
Date: Tue, 8 Nov 2022 15:15:57 +0100
Subject: [PATCH] [click] Added log parameters function

---
 src/exposed/click.py | 22 ++++++++++++++++++++++
 tests/test_click.py  | 45 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 67 insertions(+)

diff --git a/src/exposed/click.py b/src/exposed/click.py
index e48375d..5897272 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 31c1aae..e47b4bb 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
-- 
GitLab