Skip to content

Commit 8239a7b

Browse files
authored
👌 Honor -D overrides when loading needs_from_toml (#1717)
Keep Sphinx CLI config overrides (`-D` / `confoverrides`) authoritative in `load_config_from_toml` by skipping TOML assignments for keys that were already overridden. - Read override keys from `config.overrides` - Skip setting `needs_<key>` when `<key>` or `needs_<key>` is overridden - Skip setting schema entries when `needs_schema_` or `needs_schema_<key>` is overridden - Add regression test verifying TOML does not overwrite `needs_reproducible_json` when provided via `confoverrides` This preserves expected precedence: CLI overrides > TOML values > defaults.
1 parent a158906 commit 8239a7b

2 files changed

Lines changed: 31 additions & 1 deletion

File tree

‎sphinx_needs/needs.py‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,17 +482,28 @@ def load_config_from_toml(app: Sphinx, config: Config) -> None:
482482
return
483483

484484
allowed_keys = NeedsSphinxConfig.field_names()
485+
overridden_keys: set[str] = set()
486+
config_overrides = getattr(config, "overrides", None)
487+
if isinstance(config_overrides, dict):
488+
overridden_keys = {str(key) for key in config_overrides}
485489

486490
for key, value in toml_data.items():
487491
if key not in allowed_keys:
488492
continue
489-
config["needs_" + key] = NeedsSphinxConfig.convert_field_value(
493+
config_key = "needs_" + key
494+
# Keep values passed via sphinx-build -D (confoverrides) untouched.
495+
if key in overridden_keys or config_key in overridden_keys:
496+
continue
497+
config[config_key] = NeedsSphinxConfig.convert_field_value(
490498
key, value, toml_file.parent
491499
)
492500

501+
schema_config_overridden = "needs_schema_" in overridden_keys
493502
for key, value in toml_data.get("schema", {}).items():
494503
if key not in allowed_keys:
495504
continue
505+
if schema_config_overridden or f"needs_schema_{key}" in overridden_keys:
506+
continue
496507
config["needs_schema_"][key] = NeedsSphinxConfig.convert_field_value(
497508
key, value, toml_file.parent, "schema_"
498509
)

‎tests/test_needs_from_toml.py‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,22 @@ def test_needs_from_toml(test_app, snapshot):
2424
assert data == snapshot(
2525
exclude=props("created", "project", "creator", "needs_schema")
2626
)
27+
28+
29+
@pytest.mark.parametrize(
30+
"test_app",
31+
[
32+
{
33+
"buildername": "html",
34+
"srcdir": "doc_test/needs_from_toml",
35+
"no_plantuml": True,
36+
"confoverrides": {"needs_reproducible_json": False},
37+
}
38+
],
39+
indirect=True,
40+
)
41+
def test_needs_from_toml_respects_overrides(test_app):
42+
app = test_app
43+
app.build()
44+
assert not app._warning.getvalue()
45+
assert app.config.needs_reproducible_json is False

0 commit comments

Comments
 (0)