Add inheritance to the configuration schema

Amp-Thread-ID: https://ampcode.com/threads/T-019fefe0-6bbb-736e-b01c-d7f15d2db320
This commit is contained in:
Joe Rickerby
2026-09-05 15:16:45 +01:00
parent 0ea84bac64
commit 300fb1edd1
3 changed files with 569 additions and 63 deletions
+42
View File
@@ -340,6 +340,27 @@ items:
"""
)
INHERITABLE_OPTIONS = frozenset(
{
"audit-command",
"audit-requires",
"before-all",
"before-build",
"before-test",
"config-settings",
"environment",
"environment-pass",
"repair-wheel-command",
"test-command",
"test-environment",
"test-extras",
"test-groups",
"test-requires",
"test-sources",
"xbuild-tools",
}
)
for key, value in schema["properties"].items():
value["title"] = f"CIBW_{key.replace('-', '_').upper()}"
@@ -371,6 +392,19 @@ def as_object(d: dict[str, Any]) -> dict[str, Any]:
}
def inherit_schema(options: dict[str, Any]) -> dict[str, Any]:
properties = {
name: {"$ref": "#/$defs/inherit"} for name in options if name in INHERITABLE_OPTIONS
}
return {
"description": "How options at this configuration level inherit previous values.",
"oneOf": [
{"type": "string"},
as_object(properties),
],
}
oses = {
"linux": as_object(non_global_options),
"windows": as_object(not_linux),
@@ -393,6 +427,14 @@ for os_name, command in [
del oses["linux"]["properties"]["dependency-versions"]
schema["properties"]["inherit"] = {
**inherit_schema(schema["properties"]),
"title": "CIBW_INHERIT",
}
overrides["items"]["properties"]["inherit"] = inherit_schema(overrides["items"]["properties"])
for os_schema in oses.values():
os_schema["properties"]["inherit"] = inherit_schema(os_schema["properties"])
schema["properties"]["overrides"] = overrides
schema["properties"] |= oses
+463 -63
View File
@@ -27,64 +27,66 @@
"type": "object",
"properties": {
"inherit": {
"type": "object",
"additionalProperties": false,
"properties": {
"audit-command": {
"$ref": "#/$defs/inherit"
"description": "How options at this configuration level inherit previous values.",
"oneOf": [
{
"type": "string"
},
"audit-requires": {
"$ref": "#/$defs/inherit"
},
"before-all": {
"$ref": "#/$defs/inherit"
},
"before-build": {
"$ref": "#/$defs/inherit"
},
"xbuild-tools": {
"$ref": "#/$defs/inherit"
},
"xbuild-files": {
"$ref": "#/$defs/inherit"
},
"before-test": {
"$ref": "#/$defs/inherit"
},
"config-settings": {
"$ref": "#/$defs/inherit"
},
"container-engine": {
"$ref": "#/$defs/inherit"
},
"environment": {
"$ref": "#/$defs/inherit"
},
"environment-pass": {
"$ref": "#/$defs/inherit"
},
"repair-wheel-command": {
"$ref": "#/$defs/inherit"
},
"test-command": {
"$ref": "#/$defs/inherit"
},
"test-extras": {
"$ref": "#/$defs/inherit"
},
"test-sources": {
"$ref": "#/$defs/inherit"
},
"test-requires": {
"$ref": "#/$defs/inherit"
},
"test-environment": {
"$ref": "#/$defs/inherit"
},
"test-runtime": {
"$ref": "#/$defs/inherit"
{
"type": "object",
"additionalProperties": false,
"properties": {
"audit-command": {
"$ref": "#/$defs/inherit"
},
"audit-requires": {
"$ref": "#/$defs/inherit"
},
"before-all": {
"$ref": "#/$defs/inherit"
},
"before-build": {
"$ref": "#/$defs/inherit"
},
"before-test": {
"$ref": "#/$defs/inherit"
},
"config-settings": {
"$ref": "#/$defs/inherit"
},
"environment": {
"$ref": "#/$defs/inherit"
},
"environment-pass": {
"$ref": "#/$defs/inherit"
},
"xbuild-tools": {
"$ref": "#/$defs/inherit"
},
"repair-wheel-command": {
"$ref": "#/$defs/inherit"
},
"test-command": {
"$ref": "#/$defs/inherit"
},
"test-extras": {
"$ref": "#/$defs/inherit"
},
"test-sources": {
"$ref": "#/$defs/inherit"
},
"test-groups": {
"$ref": "#/$defs/inherit"
},
"test-requires": {
"$ref": "#/$defs/inherit"
},
"test-environment": {
"$ref": "#/$defs/inherit"
}
}
}
},
],
"title": "CIBW_INHERIT"
},
"audit-command": {
@@ -750,7 +752,66 @@
]
},
"inherit": {
"$ref": "#/properties/inherit"
"description": "How options at this configuration level inherit previous values.",
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"audit-command": {
"$ref": "#/$defs/inherit"
},
"audit-requires": {
"$ref": "#/$defs/inherit"
},
"before-all": {
"$ref": "#/$defs/inherit"
},
"before-build": {
"$ref": "#/$defs/inherit"
},
"before-test": {
"$ref": "#/$defs/inherit"
},
"config-settings": {
"$ref": "#/$defs/inherit"
},
"environment": {
"$ref": "#/$defs/inherit"
},
"environment-pass": {
"$ref": "#/$defs/inherit"
},
"xbuild-tools": {
"$ref": "#/$defs/inherit"
},
"repair-wheel-command": {
"$ref": "#/$defs/inherit"
},
"test-command": {
"$ref": "#/$defs/inherit"
},
"test-extras": {
"$ref": "#/$defs/inherit"
},
"test-sources": {
"$ref": "#/$defs/inherit"
},
"test-groups": {
"$ref": "#/$defs/inherit"
},
"test-requires": {
"$ref": "#/$defs/inherit"
},
"test-environment": {
"$ref": "#/$defs/inherit"
}
}
}
]
},
"audit-command": {
"$ref": "#/properties/audit-command"
@@ -880,7 +941,66 @@
"additionalProperties": false,
"properties": {
"inherit": {
"$ref": "#/properties/inherit"
"description": "How options at this configuration level inherit previous values.",
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"audit-command": {
"$ref": "#/$defs/inherit"
},
"audit-requires": {
"$ref": "#/$defs/inherit"
},
"before-all": {
"$ref": "#/$defs/inherit"
},
"before-build": {
"$ref": "#/$defs/inherit"
},
"before-test": {
"$ref": "#/$defs/inherit"
},
"config-settings": {
"$ref": "#/$defs/inherit"
},
"environment": {
"$ref": "#/$defs/inherit"
},
"environment-pass": {
"$ref": "#/$defs/inherit"
},
"xbuild-tools": {
"$ref": "#/$defs/inherit"
},
"repair-wheel-command": {
"$ref": "#/$defs/inherit"
},
"test-command": {
"$ref": "#/$defs/inherit"
},
"test-extras": {
"$ref": "#/$defs/inherit"
},
"test-sources": {
"$ref": "#/$defs/inherit"
},
"test-groups": {
"$ref": "#/$defs/inherit"
},
"test-requires": {
"$ref": "#/$defs/inherit"
},
"test-environment": {
"$ref": "#/$defs/inherit"
}
}
}
]
},
"audit-command": {
"$ref": "#/properties/audit-command"
@@ -1022,7 +1142,63 @@
"additionalProperties": false,
"properties": {
"inherit": {
"$ref": "#/properties/inherit"
"description": "How options at this configuration level inherit previous values.",
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"audit-command": {
"$ref": "#/$defs/inherit"
},
"audit-requires": {
"$ref": "#/$defs/inherit"
},
"before-all": {
"$ref": "#/$defs/inherit"
},
"before-build": {
"$ref": "#/$defs/inherit"
},
"before-test": {
"$ref": "#/$defs/inherit"
},
"config-settings": {
"$ref": "#/$defs/inherit"
},
"environment": {
"$ref": "#/$defs/inherit"
},
"xbuild-tools": {
"$ref": "#/$defs/inherit"
},
"repair-wheel-command": {
"$ref": "#/$defs/inherit"
},
"test-command": {
"$ref": "#/$defs/inherit"
},
"test-extras": {
"$ref": "#/$defs/inherit"
},
"test-sources": {
"$ref": "#/$defs/inherit"
},
"test-groups": {
"$ref": "#/$defs/inherit"
},
"test-requires": {
"$ref": "#/$defs/inherit"
},
"test-environment": {
"$ref": "#/$defs/inherit"
}
}
}
]
},
"audit-command": {
"$ref": "#/properties/audit-command"
@@ -1110,7 +1286,63 @@
"additionalProperties": false,
"properties": {
"inherit": {
"$ref": "#/properties/inherit"
"description": "How options at this configuration level inherit previous values.",
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"audit-command": {
"$ref": "#/$defs/inherit"
},
"audit-requires": {
"$ref": "#/$defs/inherit"
},
"before-all": {
"$ref": "#/$defs/inherit"
},
"before-build": {
"$ref": "#/$defs/inherit"
},
"before-test": {
"$ref": "#/$defs/inherit"
},
"config-settings": {
"$ref": "#/$defs/inherit"
},
"environment": {
"$ref": "#/$defs/inherit"
},
"xbuild-tools": {
"$ref": "#/$defs/inherit"
},
"repair-wheel-command": {
"$ref": "#/$defs/inherit"
},
"test-command": {
"$ref": "#/$defs/inherit"
},
"test-extras": {
"$ref": "#/$defs/inherit"
},
"test-sources": {
"$ref": "#/$defs/inherit"
},
"test-groups": {
"$ref": "#/$defs/inherit"
},
"test-requires": {
"$ref": "#/$defs/inherit"
},
"test-environment": {
"$ref": "#/$defs/inherit"
}
}
}
]
},
"audit-command": {
"$ref": "#/properties/audit-command"
@@ -1198,7 +1430,63 @@
"additionalProperties": false,
"properties": {
"inherit": {
"$ref": "#/properties/inherit"
"description": "How options at this configuration level inherit previous values.",
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"audit-command": {
"$ref": "#/$defs/inherit"
},
"audit-requires": {
"$ref": "#/$defs/inherit"
},
"before-all": {
"$ref": "#/$defs/inherit"
},
"before-build": {
"$ref": "#/$defs/inherit"
},
"before-test": {
"$ref": "#/$defs/inherit"
},
"config-settings": {
"$ref": "#/$defs/inherit"
},
"environment": {
"$ref": "#/$defs/inherit"
},
"xbuild-tools": {
"$ref": "#/$defs/inherit"
},
"repair-wheel-command": {
"$ref": "#/$defs/inherit"
},
"test-command": {
"$ref": "#/$defs/inherit"
},
"test-extras": {
"$ref": "#/$defs/inherit"
},
"test-sources": {
"$ref": "#/$defs/inherit"
},
"test-groups": {
"$ref": "#/$defs/inherit"
},
"test-requires": {
"$ref": "#/$defs/inherit"
},
"test-environment": {
"$ref": "#/$defs/inherit"
}
}
}
]
},
"audit-command": {
"$ref": "#/properties/audit-command"
@@ -1273,7 +1561,63 @@
"additionalProperties": false,
"properties": {
"inherit": {
"$ref": "#/properties/inherit"
"description": "How options at this configuration level inherit previous values.",
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"audit-command": {
"$ref": "#/$defs/inherit"
},
"audit-requires": {
"$ref": "#/$defs/inherit"
},
"before-all": {
"$ref": "#/$defs/inherit"
},
"before-build": {
"$ref": "#/$defs/inherit"
},
"before-test": {
"$ref": "#/$defs/inherit"
},
"config-settings": {
"$ref": "#/$defs/inherit"
},
"environment": {
"$ref": "#/$defs/inherit"
},
"xbuild-tools": {
"$ref": "#/$defs/inherit"
},
"repair-wheel-command": {
"$ref": "#/$defs/inherit"
},
"test-command": {
"$ref": "#/$defs/inherit"
},
"test-extras": {
"$ref": "#/$defs/inherit"
},
"test-sources": {
"$ref": "#/$defs/inherit"
},
"test-groups": {
"$ref": "#/$defs/inherit"
},
"test-requires": {
"$ref": "#/$defs/inherit"
},
"test-environment": {
"$ref": "#/$defs/inherit"
}
}
}
]
},
"audit-command": {
"$ref": "#/properties/audit-command"
@@ -1361,7 +1705,63 @@
"additionalProperties": false,
"properties": {
"inherit": {
"$ref": "#/properties/inherit"
"description": "How options at this configuration level inherit previous values.",
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"audit-command": {
"$ref": "#/$defs/inherit"
},
"audit-requires": {
"$ref": "#/$defs/inherit"
},
"before-all": {
"$ref": "#/$defs/inherit"
},
"before-build": {
"$ref": "#/$defs/inherit"
},
"before-test": {
"$ref": "#/$defs/inherit"
},
"config-settings": {
"$ref": "#/$defs/inherit"
},
"environment": {
"$ref": "#/$defs/inherit"
},
"xbuild-tools": {
"$ref": "#/$defs/inherit"
},
"repair-wheel-command": {
"$ref": "#/$defs/inherit"
},
"test-command": {
"$ref": "#/$defs/inherit"
},
"test-extras": {
"$ref": "#/$defs/inherit"
},
"test-sources": {
"$ref": "#/$defs/inherit"
},
"test-groups": {
"$ref": "#/$defs/inherit"
},
"test-requires": {
"$ref": "#/$defs/inherit"
},
"test-environment": {
"$ref": "#/$defs/inherit"
}
}
}
]
},
"audit-command": {
"$ref": "#/properties/audit-command"
+64
View File
@@ -143,6 +143,70 @@ def test_overrides_invalid_inherit_value(validator: validate_pyproject.api.Valid
validator(example)
@pytest.mark.parametrize(
"config",
[
"""
[tool.cibuildwheel]
inherit.audit-command = "append"
audit-command = "twine check {wheel}"
""",
"""
[tool.cibuildwheel]
inherit = "audit-command; audit-requires: prepend"
audit-command = "twine check {wheel}"
""",
"""
[tool.cibuildwheel.linux]
inherit.before-all = "prepend"
before-all = "dnf install libfoo-devel"
""",
],
)
def test_inherit_forms(validator: validate_pyproject.api.Validator, config: str) -> None:
assert validator(tomllib.loads(config)) is not None
@pytest.mark.parametrize(
"config",
[
"""
[tool.cibuildwheel]
inherit.archs = "append"
""",
"""
[tool.cibuildwheel]
inherit.build = "append"
""",
"""
[tool.cibuildwheel]
inherit.container-engine = "append"
""",
"""
[tool.cibuildwheel]
inherit.enable = "append"
""",
"""
[tool.cibuildwheel]
inherit.skip = "append"
""",
"""
[tool.cibuildwheel]
inherit.test-skip = "append"
""",
"""
[tool.cibuildwheel.macos]
inherit.environment-pass = "append"
""",
],
)
def test_invalid_inherit_option_for_scope(
validator: validate_pyproject.api.Validator, config: str
) -> None:
with pytest.raises(validate_pyproject.error_reporting.ValidationError):
validator(tomllib.loads(config))
def test_docs_examples(validator: validate_pyproject.api.Validator) -> None:
"""
Parse out all the configuration examples, build valid TOML out of them, and