From 2118909705271accf8f9bbe3221cc02885d9aa9c Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Fri, 17 Nov 2023 16:36:46 -0500 Subject: [PATCH 1/2] feat: support namespaced config settings Signed-off-by: Henry Schreiner --- .../settings/skbuild_read_settings.py | 15 ++++++++++++--- tests/test_skbuild_settings.py | 6 +++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/scikit_build_core/settings/skbuild_read_settings.py b/src/scikit_build_core/settings/skbuild_read_settings.py index 8e7af373..810e64b4 100644 --- a/src/scikit_build_core/settings/skbuild_read_settings.py +++ b/src/scikit_build_core/settings/skbuild_read_settings.py @@ -179,9 +179,16 @@ def __init__( else: tool_skb[key] = value + prefixed = { + k: v for k, v in config_settings.items() if k.startswith("skbuild.") + } + remaining = { + k: v for k, v in config_settings.items() if not k.startswith("skbuild.") + } self.sources = SourceChain( EnvSource("SKBUILD"), - ConfSource(settings=config_settings, verify=verify_conf), + ConfSource("skbuild", settings=prefixed, verify=verify_conf), + ConfSource(settings=remaining, verify=verify_conf), TOMLSource("tool", "scikit-build", settings=pyproject), prefixes=["tool", "scikit-build"], ) @@ -240,8 +247,10 @@ def suggestions(self, index: int) -> dict[str, list[str]]: return result def print_suggestions(self) -> None: - for index in (1, 2): - name = {1: "config-settings", 2: "pyproject.toml"}[index] + for index in (1, 2, 3): + name = {1: "config-settings", 2: "config-settings", 3: "pyproject.toml"}[ + index + ] suggestions_dict = self.suggestions(index) if suggestions_dict: rich_print(f"[red][bold]ERROR:[/bold] Unrecognized options in {name}:") diff --git a/tests/test_skbuild_settings.py b/tests/test_skbuild_settings.py index 68c18e09..1552f198 100644 --- a/tests/test_skbuild_settings.py +++ b/tests/test_skbuild_settings.py @@ -135,8 +135,9 @@ def test_skbuild_settings_envvar(tmp_path: Path, monkeypatch: pytest.MonkeyPatch assert not settings.install.strip +@pytest.mark.parametrize("prefix", [True, False], ids=["skbuild", "noprefix"]) def test_skbuild_settings_config_settings( - tmp_path: Path, monkeypatch: pytest.MonkeyPatch + tmp_path: Path, monkeypatch: pytest.MonkeyPatch, prefix: str ): monkeypatch.setattr( scikit_build_core.settings.skbuild_read_settings, "__version__", "0.1.0" @@ -177,6 +178,9 @@ def test_skbuild_settings_config_settings( "install.strip": "True", } + if prefix: + config_settings = {f"{prefix}.{k}": v for k, v in config_settings.items()} + settings_reader = SettingsReader.from_file(pyproject_toml, config_settings) settings = settings_reader.settings assert list(settings_reader.unrecognized_options()) == [] From f407b73665f0529380c43351dde744be6b616642 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Tue, 28 Nov 2023 18:58:18 -0500 Subject: [PATCH 2/2] tests: fix issue with prefix Signed-off-by: Henry Schreiner --- tests/test_skbuild_settings.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_skbuild_settings.py b/tests/test_skbuild_settings.py index 1552f198..8aa9a7df 100644 --- a/tests/test_skbuild_settings.py +++ b/tests/test_skbuild_settings.py @@ -137,7 +137,7 @@ def test_skbuild_settings_envvar(tmp_path: Path, monkeypatch: pytest.MonkeyPatch @pytest.mark.parametrize("prefix", [True, False], ids=["skbuild", "noprefix"]) def test_skbuild_settings_config_settings( - tmp_path: Path, monkeypatch: pytest.MonkeyPatch, prefix: str + tmp_path: Path, monkeypatch: pytest.MonkeyPatch, prefix: bool ): monkeypatch.setattr( scikit_build_core.settings.skbuild_read_settings, "__version__", "0.1.0" @@ -179,7 +179,7 @@ def test_skbuild_settings_config_settings( } if prefix: - config_settings = {f"{prefix}.{k}": v for k, v in config_settings.items()} + config_settings = {f"skbuild.{k}": v for k, v in config_settings.items()} settings_reader = SettingsReader.from_file(pyproject_toml, config_settings) settings = settings_reader.settings