feat: support config-settings (#1244)
* feat: support config-settings Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com> feat: support config-settings Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com> * refactor: use shlex.quote Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com> Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
This commit is contained in:
@@ -14,7 +14,7 @@ else:
|
||||
from cibuildwheel.__main__ import main
|
||||
from cibuildwheel.environment import ParsedEnvironment
|
||||
from cibuildwheel.options import BuildOptions, _get_pinned_container_images
|
||||
from cibuildwheel.util import BuildSelector, resources_dir
|
||||
from cibuildwheel.util import BuildSelector, resources_dir, split_config_settings
|
||||
|
||||
# CIBW_PLATFORM is tested in main_platform_test.py
|
||||
|
||||
@@ -263,6 +263,27 @@ def test_build_verbosity(
|
||||
assert build_options.build_verbosity == expected_verbosity
|
||||
|
||||
|
||||
@pytest.mark.parametrize("platform_specific", [False, True])
|
||||
def test_config_settings(platform_specific, platform, intercepted_build_args, monkeypatch):
|
||||
config_settings = 'setting=value setting=value2 other="something else"'
|
||||
if platform_specific:
|
||||
monkeypatch.setenv("CIBW_CONFIG_SETTINGS_" + platform.upper(), config_settings)
|
||||
monkeypatch.setenv("CIBW_CONFIG_SETTIGNS", "a=b")
|
||||
else:
|
||||
monkeypatch.setenv("CIBW_CONFIG_SETTINGS", config_settings)
|
||||
|
||||
main()
|
||||
build_options = intercepted_build_args.args[0].build_options(identifier=None)
|
||||
|
||||
assert build_options.config_settings == config_settings
|
||||
|
||||
assert split_config_settings(config_settings) == [
|
||||
"--config-setting=setting=value",
|
||||
"--config-setting=setting=value2",
|
||||
"--config-setting=other=something else",
|
||||
]
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"selector",
|
||||
[
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import platform as platform_module
|
||||
import textwrap
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -58,7 +59,7 @@ test_command: 'pyproject'
|
||||
|
||||
default_build_options = options.build_options(identifier=None)
|
||||
|
||||
assert default_build_options.environment == parse_environment('FOO="BAR"')
|
||||
assert default_build_options.environment == parse_environment("FOO=BAR")
|
||||
|
||||
all_pinned_container_images = _get_pinned_container_images()
|
||||
pinned_x86_64_container_image = all_pinned_container_images["x86_64"]
|
||||
@@ -116,3 +117,32 @@ def test_passthrough_evil(tmp_path, monkeypatch, env_var_value):
|
||||
monkeypatch.setenv("ENV_VAR", env_var_value)
|
||||
parsed_environment = options.build_options(identifier=None).environment
|
||||
assert parsed_environment.as_dictionary(prev_environment={}) == {"ENV_VAR": env_var_value}
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"env_var_value",
|
||||
[
|
||||
"normal value",
|
||||
'"value wrapped in quotes"',
|
||||
'an unclosed double-quote: "',
|
||||
"string\nwith\ncarriage\nreturns\n",
|
||||
"a trailing backslash \\",
|
||||
],
|
||||
)
|
||||
def test_toml_environment_evil(tmp_path, monkeypatch, env_var_value):
|
||||
args = get_default_command_line_arguments()
|
||||
args.package_dir = tmp_path
|
||||
|
||||
with tmp_path.joinpath("pyproject.toml").open("w") as f:
|
||||
f.write(
|
||||
textwrap.dedent(
|
||||
f"""\
|
||||
[tool.cibuildwheel.environment]
|
||||
EXAMPLE='''{env_var_value}'''
|
||||
"""
|
||||
)
|
||||
)
|
||||
|
||||
options = Options(platform="linux", command_line_arguments=args)
|
||||
parsed_environment = options.build_options(identifier=None).environment
|
||||
assert parsed_environment.as_dictionary(prev_environment={}) == {"EXAMPLE": env_var_value}
|
||||
|
||||
@@ -331,3 +331,38 @@ test-command = "pyproject-override"
|
||||
|
||||
with pytest.raises(ConfigOptionError):
|
||||
OptionsReader(config_file_path=pyproject_toml, platform=platform)
|
||||
|
||||
|
||||
def test_config_settings(tmp_path):
|
||||
pyproject_toml: Path = tmp_path / "pyproject.toml"
|
||||
pyproject_toml.write_text(
|
||||
"""\
|
||||
[tool.cibuildwheel.config-settings]
|
||||
example = "one"
|
||||
other = ["two", "three"]
|
||||
"""
|
||||
)
|
||||
|
||||
options_reader = OptionsReader(config_file_path=pyproject_toml, platform="linux")
|
||||
assert (
|
||||
options_reader.get("config-settings", table={"item": '{k}="{v}"', "sep": " "})
|
||||
== 'example="one" other="two" other="three"'
|
||||
)
|
||||
|
||||
|
||||
def test_pip_config_settings(tmp_path):
|
||||
pyproject_toml: Path = tmp_path / "pyproject.toml"
|
||||
pyproject_toml.write_text(
|
||||
"""\
|
||||
[tool.cibuildwheel.config-settings]
|
||||
--build-option="--use-mypyc"
|
||||
"""
|
||||
)
|
||||
|
||||
options_reader = OptionsReader(config_file_path=pyproject_toml, platform="linux")
|
||||
assert (
|
||||
options_reader.get(
|
||||
"config-settings", table={"item": "--config-settings='{k}=\"{v}\"'", "sep": " "}
|
||||
)
|
||||
== "--config-settings='--build-option=\"--use-mypyc\"'"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user