Skip to content

Commit 18e69c1

Browse files
committed
Fix Click default option handling
1 parent dd8253d commit 18e69c1

3 files changed

Lines changed: 44 additions & 0 deletions

File tree

docs/about/release-notes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ The current members of the MkDocs-NG team.
2727

2828
### Fixed
2929

30+
* Fix CLI default handling with recent Click versions so omitted options do not override configured `strict`, `use_directory_urls`, or serve reload mode values.
3031
* Fix dropdown submenu arrow invisible in the navigation menu. #44
3132
* Fix malformed URLs (e.g., unterminated IPv6 literals) crashing the entire build. #45
3233
* Fix build crash caused by broken (dangling) symlinks in the docs directory. #46

mkdocs/__main__.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,19 @@ def callback(ctx, param, value):
219219
)(f)
220220

221221

222+
def unset_default_source_values(kwargs, *names):
223+
ctx = click.get_current_context(silent=True)
224+
if ctx is None:
225+
return
226+
227+
for name in names:
228+
if (
229+
name in kwargs
230+
and ctx.get_parameter_source(name) is click.core.ParameterSource.DEFAULT
231+
):
232+
kwargs[name] = None
233+
234+
222235
common_options = add_options(quiet_option, verbose_option)
223236
common_config_options = add_options(
224237
click.option("-f", "--config-file", type=click.File("rb"), help=config_help),
@@ -283,6 +296,7 @@ def serve_command(**kwargs):
283296
from mkdocs.commands import serve
284297

285298
_enable_warnings()
299+
unset_default_source_values(kwargs, "build_type", "strict", "use_directory_urls")
286300
serve.serve(**kwargs)
287301

288302

@@ -296,6 +310,7 @@ def build_command(clean, **kwargs):
296310
from mkdocs.commands import build
297311

298312
_enable_warnings()
313+
unset_default_source_values(kwargs, "strict", "use_directory_urls")
299314
cfg = config.load_config(**kwargs)
300315
cfg.plugins.on_startup(command="build", dirty=not clean)
301316
try:
@@ -331,6 +346,7 @@ def gh_deploy_command(
331346
from mkdocs.commands import build, gh_deploy
332347

333348
_enable_warnings()
349+
unset_default_source_values(kwargs, "strict", "use_directory_urls")
334350
cfg = config.load_config(
335351
remote_branch=remote_branch, remote_name=remote_name, **kwargs
336352
)

mkdocs/tests/cli_tests.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,33 @@ class CLITests(unittest.TestCase):
1414
def setUp(self):
1515
self.runner = CliRunner()
1616

17+
def test_unset_default_source_values_restores_default_values(self):
18+
kwargs = {"build_type": "False", "strict": False, "use_directory_urls": False}
19+
ctx = mock.Mock()
20+
ctx.get_parameter_source.return_value = cli.click.core.ParameterSource.DEFAULT
21+
22+
with mock.patch("mkdocs.__main__.click.get_current_context", return_value=ctx):
23+
cli.unset_default_source_values(
24+
kwargs, "build_type", "strict", "use_directory_urls"
25+
)
26+
27+
self.assertIsNone(kwargs["build_type"])
28+
self.assertIsNone(kwargs["strict"])
29+
self.assertIsNone(kwargs["use_directory_urls"])
30+
31+
def test_unset_default_source_values_preserves_commandline_values(self):
32+
kwargs = {"strict": False, "use_directory_urls": False}
33+
ctx = mock.Mock()
34+
ctx.get_parameter_source.return_value = (
35+
cli.click.core.ParameterSource.COMMANDLINE
36+
)
37+
38+
with mock.patch("mkdocs.__main__.click.get_current_context", return_value=ctx):
39+
cli.unset_default_source_values(kwargs, "strict", "use_directory_urls")
40+
41+
self.assertFalse(kwargs["strict"])
42+
self.assertFalse(kwargs["use_directory_urls"])
43+
1744
@mock.patch("mkdocs.commands.serve.serve", autospec=True)
1845
def test_serve_default(self, mock_serve):
1946
result = self.runner.invoke(cli.cli, ["serve"], catch_exceptions=False)

0 commit comments

Comments
 (0)