diff --git a/docs/about/release-notes.md b/docs/about/release-notes.md index dc90f98b..33bcf08e 100644 --- a/docs/about/release-notes.md +++ b/docs/about/release-notes.md @@ -27,6 +27,7 @@ The current members of the MkDocs-NG team. ### Fixed +* Fix CLI default handling with recent Click versions so omitted options do not override configured `strict`, `use_directory_urls`, or serve reload mode values. * Fix dropdown submenu arrow invisible in the navigation menu. #44 * Fix malformed URLs (e.g., unterminated IPv6 literals) crashing the entire build. #45 * Fix build crash caused by broken (dangling) symlinks in the docs directory. #46 diff --git a/mkdocs/__main__.py b/mkdocs/__main__.py index a6e278c0..1f81388d 100644 --- a/mkdocs/__main__.py +++ b/mkdocs/__main__.py @@ -219,6 +219,19 @@ def callback(ctx, param, value): )(f) +def unset_default_source_values(kwargs, *names): + ctx = click.get_current_context(silent=True) + if ctx is None: + return + + for name in names: + if ( + name in kwargs + and ctx.get_parameter_source(name) is click.core.ParameterSource.DEFAULT + ): + kwargs[name] = None + + common_options = add_options(quiet_option, verbose_option) common_config_options = add_options( click.option("-f", "--config-file", type=click.File("rb"), help=config_help), @@ -283,6 +296,7 @@ def serve_command(**kwargs): from mkdocs.commands import serve _enable_warnings() + unset_default_source_values(kwargs, "build_type", "strict", "use_directory_urls") serve.serve(**kwargs) @@ -296,6 +310,7 @@ def build_command(clean, **kwargs): from mkdocs.commands import build _enable_warnings() + unset_default_source_values(kwargs, "strict", "use_directory_urls") cfg = config.load_config(**kwargs) cfg.plugins.on_startup(command="build", dirty=not clean) try: @@ -331,6 +346,7 @@ def gh_deploy_command( from mkdocs.commands import build, gh_deploy _enable_warnings() + unset_default_source_values(kwargs, "strict", "use_directory_urls") cfg = config.load_config( remote_branch=remote_branch, remote_name=remote_name, **kwargs ) diff --git a/mkdocs/tests/cli_tests.py b/mkdocs/tests/cli_tests.py index d4f1cefd..e028f146 100644 --- a/mkdocs/tests/cli_tests.py +++ b/mkdocs/tests/cli_tests.py @@ -14,6 +14,33 @@ class CLITests(unittest.TestCase): def setUp(self): self.runner = CliRunner() + def test_unset_default_source_values_restores_default_values(self): + kwargs = {"build_type": "False", "strict": False, "use_directory_urls": False} + ctx = mock.Mock() + ctx.get_parameter_source.return_value = cli.click.core.ParameterSource.DEFAULT + + with mock.patch("mkdocs.__main__.click.get_current_context", return_value=ctx): + cli.unset_default_source_values( + kwargs, "build_type", "strict", "use_directory_urls" + ) + + self.assertIsNone(kwargs["build_type"]) + self.assertIsNone(kwargs["strict"]) + self.assertIsNone(kwargs["use_directory_urls"]) + + def test_unset_default_source_values_preserves_commandline_values(self): + kwargs = {"strict": False, "use_directory_urls": False} + ctx = mock.Mock() + ctx.get_parameter_source.return_value = ( + cli.click.core.ParameterSource.COMMANDLINE + ) + + with mock.patch("mkdocs.__main__.click.get_current_context", return_value=ctx): + cli.unset_default_source_values(kwargs, "strict", "use_directory_urls") + + self.assertFalse(kwargs["strict"]) + self.assertFalse(kwargs["use_directory_urls"]) + @mock.patch("mkdocs.commands.serve.serve", autospec=True) def test_serve_default(self, mock_serve): result = self.runner.invoke(cli.cli, ["serve"], catch_exceptions=False) diff --git a/pyproject.toml b/pyproject.toml index 6e610245..37bffb20 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ classifiers = [ dynamic = ["version"] requires-python = ">=3.8" dependencies = [ - "click >=7.0", + "click >=8.1.8", "Jinja2 >=2.11.1", "markupsafe >=2.0.1", "Markdown >=3.3.6",