From 13fd89ee17bd5bf2b6c6e6c9dc5099953d7ad168 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Sun, 13 Sep 2026 10:30:54 +0000 Subject: [PATCH] fix: relax mike settings validation (#932) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Timothée Mazzucotelli --- python/tests/unit/test_plugin_config.py | 35 +++++++++++++++++++++++++ python/zensical/config.py | 10 +++++-- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/python/tests/unit/test_plugin_config.py b/python/tests/unit/test_plugin_config.py index bede3bb..f72af18 100644 --- a/python/tests/unit/test_plugin_config.py +++ b/python/tests/unit/test_plugin_config.py @@ -128,6 +128,36 @@ def test_normalizes_mike_defaults() -> None: } +@pytest.mark.parametrize("version_selector", [False, True]) +def test_preserves_mike_version_selector(version_selector: bool) -> None: + plugins = _convert_plugins({"mike": {"version_selector": version_selector}}) + + assert plugins["mike"]["config"]["version_selector"] is version_selector + + +def test_silently_discards_unsupported_mike_options( + capsys: pytest.CaptureFixture[str], +) -> None: + plugins = _convert_plugins( + { + "mike": { + "version_selector": False, + "css_dir": "assets/css", + "javascript_dir": "assets/js", + } + } + ) + + assert plugins["mike"]["config"] == { + "alias_type": "symlink", + "redirect_template": None, + "deploy_prefix": "", + "canonical_version": None, + "version_selector": False, + } + assert capsys.readouterr().err == "" + + @pytest.mark.parametrize("name", [*PYTHON_PLUGINS, "tags", "external"]) def test_plugin_configuration_must_be_a_mapping(name: str) -> None: with pytest.raises( @@ -328,6 +358,11 @@ def test_silently_discards_unsupported_autorefs_options( ), ("offline", {"enabled": "yes"}, "enabled must be a boolean"), ("mike", {"canonical_version": 42}, "must be a string or null"), + ( + "mike", + {"version_selector": "false"}, + "version_selector must be a boolean", + ), ("autorefs", {"enabled": "yes"}, "enabled must be a boolean"), ("markdown-exec", {"ansi": "sometimes"}, "ansi must be"), ( diff --git a/python/zensical/config.py b/python/zensical/config.py index 2679aec..0fee9ec 100644 --- a/python/zensical/config.py +++ b/python/zensical/config.py @@ -1675,12 +1675,18 @@ def _convert_plugins(value: Any, config: dict) -> dict: "deploy_prefix": "", } nullable_strings = ("redirect_template", "canonical_version") + # Zensical bundles its own version selector assets, so accept and + # discard Mike's asset directory options for compatibility. + unsupported = {"css_dir", "javascript_dir"} _reject_unknown_options( "mike", mike, - {"enabled", *string_defaults, *nullable_strings}, + {"enabled", "version_selector", *string_defaults, *nullable_strings} + | unsupported, ) - _validate_boolean_options("mike", mike, ("enabled",)) + for name in sorted(unsupported & mike.keys()): + mike.pop(name) + _validate_boolean_options("mike", mike, ("enabled", "version_selector")) for name, default in string_defaults.items(): set_default(mike, name, default) _validate_string_options("mike", mike, string_defaults)