Merge pull request #2797 from daltonmaag/fix-unbounded-conditions
Avoid crash when handling unbounded conditions during designspace splitting
This commit is contained in:
commit
876f87e4be
@ -352,9 +352,10 @@ def _extractSubSpace(
|
||||
def _conditionSetFrom(conditionSet: List[Dict[str, Any]]) -> ConditionSet:
|
||||
c: Dict[str, Range] = {}
|
||||
for condition in conditionSet:
|
||||
minimum, maximum = condition.get("minimum"), condition.get("maximum")
|
||||
c[condition["name"]] = Range(
|
||||
condition.get("minimum", -math.inf),
|
||||
condition.get("maximum", math.inf),
|
||||
minimum if minimum is not None else -math.inf,
|
||||
maximum if maximum is not None else math.inf,
|
||||
)
|
||||
return c
|
||||
|
||||
|
@ -1,9 +1,16 @@
|
||||
import math
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
from fontTools.designspaceLib import DesignSpaceDocument
|
||||
from fontTools.designspaceLib.split import splitInterpolable, splitVariableFonts, convert5to4
|
||||
from fontTools.designspaceLib.split import (
|
||||
_conditionSetFrom,
|
||||
convert5to4,
|
||||
splitInterpolable,
|
||||
splitVariableFonts,
|
||||
)
|
||||
from fontTools.designspaceLib.types import ConditionSet, Range
|
||||
|
||||
from .fixtures import datadir
|
||||
|
||||
@ -148,3 +155,57 @@ def test_convert5to4(datadir, tmpdir, test_ds, expected_vfs):
|
||||
assert data_out.read_text(encoding="utf-8") == temp_out.read_text(
|
||||
encoding="utf-8"
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
["unbounded_condition"],
|
||||
[
|
||||
({"name": "Weight", "minimum": 500},),
|
||||
({"name": "Weight", "maximum": 500},),
|
||||
({"name": "Weight", "minimum": 500, "maximum": None},),
|
||||
({"name": "Weight", "minimum": None, "maximum": 500},),
|
||||
],
|
||||
)
|
||||
def test_optional_min_max(unbounded_condition):
|
||||
"""Check that split functions can handle conditions that are partially
|
||||
unbounded without tripping over None values and missing keys."""
|
||||
doc = DesignSpaceDocument()
|
||||
|
||||
doc.addAxisDescriptor(
|
||||
name="Weight", tag="wght", minimum=400, maximum=1000, default=400
|
||||
)
|
||||
|
||||
doc.addRuleDescriptor(
|
||||
name="unbounded",
|
||||
conditionSets=[[unbounded_condition]],
|
||||
)
|
||||
|
||||
assert len(list(splitInterpolable(doc))) == 1
|
||||
assert len(list(splitVariableFonts(doc))) == 1
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
["condition", "expected_set"],
|
||||
[
|
||||
(
|
||||
{"name": "axis", "minimum": 0.5},
|
||||
{"axis": Range(minimum=0.5, maximum=math.inf)},
|
||||
),
|
||||
(
|
||||
{"name": "axis", "maximum": 0.5},
|
||||
{"axis": Range(minimum=-math.inf, maximum=0.5)},
|
||||
),
|
||||
(
|
||||
{"name": "axis", "minimum": 0.5, "maximum": None},
|
||||
{"axis": Range(minimum=0.5, maximum=math.inf)},
|
||||
),
|
||||
(
|
||||
{"name": "axis", "minimum": None, "maximum": 0.5},
|
||||
{"axis": Range(minimum=-math.inf, maximum=0.5)},
|
||||
),
|
||||
],
|
||||
)
|
||||
def test_optional_min_max_internal(condition, expected_set: ConditionSet):
|
||||
"""Check that split's internal helper functions produce the correct output
|
||||
for conditions that are partially unbounded."""
|
||||
assert _conditionSetFrom([condition]) == expected_set
|
||||
|
Loading…
x
Reference in New Issue
Block a user