From ada98281216e0dbb76b3d24ce9f2a46aaf302bc7 Mon Sep 17 00:00:00 2001 From: Nikolaus Waxweiler Date: Fri, 29 Apr 2022 16:56:50 +0100 Subject: [PATCH 1/5] Add some proper exceptions --- Lib/fontTools/designspaceLib/statNames.py | 8 ++++++-- Lib/fontTools/designspaceLib/types.py | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Lib/fontTools/designspaceLib/statNames.py b/Lib/fontTools/designspaceLib/statNames.py index 0a475c89a..c585569db 100644 --- a/Lib/fontTools/designspaceLib/statNames.py +++ b/Lib/fontTools/designspaceLib/statNames.py @@ -113,8 +113,12 @@ def getStatNames( styleMapFamilyNames = {} for language in set(familyNames).union(styleNames.keys()): - familyName = familyNames.get(language, familyNames["en"]) - styleName = styleNamesForStyleMap.get(language, styleNamesForStyleMap["en"]) + try: + familyName = familyNames.get(language, familyNames["en"]) + styleName = styleNamesForStyleMap.get(language, styleNamesForStyleMap["en"]) + except KeyError: + LOGGER.warning("Cannot complete localized style map name because there are no English language fallbacks.") + continue styleMapFamilyNames[language] = (familyName + " " + styleName).strip() return StatNames( diff --git a/Lib/fontTools/designspaceLib/types.py b/Lib/fontTools/designspaceLib/types.py index 8afea96c9..30731323b 100644 --- a/Lib/fontTools/designspaceLib/types.py +++ b/Lib/fontTools/designspaceLib/types.py @@ -5,6 +5,8 @@ from typing import Dict, List, Optional, Union from fontTools.designspaceLib import ( DesignSpaceDocument, + DesignSpaceDocumentError, + DiscreteAxisDescriptor, RangeAxisSubsetDescriptor, SimpleLocationDict, VariableFontDescriptor, @@ -89,6 +91,10 @@ def userRegionToDesignRegion(doc: DesignSpaceDocument, userRegion: Region) -> Re designRegion = {} for name, value in userRegion.items(): axis = doc.getAxis(name) + if axis is None: + raise DesignSpaceDocumentError( + f"Cannot find axis named '{name}' for region." + ) if isinstance(value, (float, int)): designRegion[name] = axis.map_forward(value) else: @@ -107,7 +113,16 @@ def getVFUserRegion(doc: DesignSpaceDocument, vf: VariableFontDescriptor) -> Reg # - it's a single location = use it to know which rules should apply in the VF for axisSubset in vf.axisSubsets: axis = doc.getAxis(axisSubset.name) + if axis is None: + raise DesignSpaceDocumentError( + f"Cannot find axis named '{axisSubset.name}' for variable font '{vf.name}'." + ) if isinstance(axisSubset, RangeAxisSubsetDescriptor): + if isinstance(axis, DiscreteAxisDescriptor): + raise DesignSpaceDocumentError( + f"Cannot select a range over '{axis.name}' for variable font '{vf.name}' " + "because it's a discrete axis, use only 'userValue' instead." + ) vfUserRegion[axis.name] = Range( max(axisSubset.userMinimum, axis.minimum), min(axisSubset.userMaximum, axis.maximum), @@ -118,5 +133,9 @@ def getVFUserRegion(doc: DesignSpaceDocument, vf: VariableFontDescriptor) -> Reg # Any axis not mentioned explicitly has a single location = default value for axis in doc.axes: if axis.name not in vfUserRegion: + if not isinstance(axis.default, (int, float)): + raise DesignSpaceDocumentError( + f"Axis '{axis.name}' has no valid default value." + ) vfUserRegion[axis.name] = axis.default return vfUserRegion From 177e0a71b891ffada0b1f8c46eb7be64b206c60f Mon Sep 17 00:00:00 2001 From: Nikolaus Waxweiler Date: Fri, 29 Apr 2022 16:57:06 +0100 Subject: [PATCH 2/5] Clean up one of the DSv5 documents somewhat --- Tests/designspaceLib/data/test_v5.designspace | 74 +++++++++++-------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/Tests/designspaceLib/data/test_v5.designspace b/Tests/designspaceLib/data/test_v5.designspace index 2f611b49d..d2b3cdaef 100644 --- a/Tests/designspaceLib/data/test_v5.designspace +++ b/Tests/designspaceLib/data/test_v5.designspace @@ -1,7 +1,7 @@ - + Wéíght قطر @@ -24,7 +24,7 @@ -