diff --git a/Lib/fontTools/varLib/__init__.py b/Lib/fontTools/varLib/__init__.py index e0875709b..c1a64d131 100644 --- a/Lib/fontTools/varLib/__init__.py +++ b/Lib/fontTools/varLib/__init__.py @@ -265,7 +265,11 @@ def build(designspace_filename, master_finder=lambda s:s, axisMap=None): (axis-tag, axis-name). """ - axes, masters, instances = designspace.load(designspace_filename) + ds = designspace.load(designspace_filename) + axes = ds['axes'] + masters = ds['masters'] + instances = ds['instances'] + base_idx = None for i,m in enumerate(masters): if 'info' in m and m['info']['copy']: diff --git a/Lib/fontTools/varLib/designspace.py b/Lib/fontTools/varLib/designspace.py index a7197f28e..d96d9f6b4 100644 --- a/Lib/fontTools/varLib/designspace.py +++ b/Lib/fontTools/varLib/designspace.py @@ -61,6 +61,7 @@ def _loadAxis(et): return item def _load(et): + designspace = {} ds = et.getroot() axes = [] @@ -68,20 +69,23 @@ def _load(et): if ds_axes: for et in ds_axes: axes.append(_loadAxis(et)) + designspace['axes'] = axes masters = [] for et in ds.find('sources'): masters.append(_loadItem(et)) + designspace['masters'] = masters instances = [] for et in ds.find('instances'): instances.append(_loadItem(et)) + designspace['instances'] = instances - return axes, masters, instances + return designspace def load(filename): """Load designspace from a file name or object. - Returns three items: + Returns a dictionary containing three items: - list of axes - list of masters (aka sources) - list of instances""" diff --git a/Lib/fontTools/varLib/interpolate_layout.py b/Lib/fontTools/varLib/interpolate_layout.py index cfe66d668..fc172509c 100644 --- a/Lib/fontTools/varLib/interpolate_layout.py +++ b/Lib/fontTools/varLib/interpolate_layout.py @@ -12,7 +12,11 @@ import os.path def interpolate_layout(designspace_filename, loc, finder): - axes, masters, instances = designspace.load(designspace_filename) + ds = designspace.load(designspace_filename) + axes = ds['axes'] + masters = ds['masters'] + instances = ds['instances'] + base_idx = None for i,m in enumerate(masters): if 'info' in m and m['info']['copy']: diff --git a/NEWS.rst b/NEWS.rst index ca0c8f124..602d6927a 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -1,3 +1,6 @@ +- [varLib] designspace.load() now returns a dictionary, instead of a tuple, + and supports element (#864) + 3.7.2 (released 2017-02-17) --------------------------- diff --git a/Tests/varLib/designspace_test.py b/Tests/varLib/designspace_test.py index da42c3188..0978f54f9 100644 --- a/Tests/varLib/designspace_test.py +++ b/Tests/varLib/designspace_test.py @@ -10,45 +10,46 @@ class DesignspaceTest(unittest.TestCase): self.assertEqual( designspace.load(_getpath("VarLibTest.designspace")), - # axes - ([{'map': [{'input': 0.0, 'output': 10.0}, - {'input': 401.0, 'output': 66.0}, - {'input': 1000.0, 'output': 990.0}], - 'name': 'weight', - 'default': 0.0, - 'tag': 'wght', - 'maximum': 1000.0, - 'minimum': 0.0}, - {'default': 250.0, - 'minimum': 0.0, - 'tag': 'wdth', - 'maximum': 1000.0, - 'name': 'width'}, - {'name': 'contrast', - 'default': 0.0, - 'tag': 'cntr', - 'maximum': 100.0, - 'minimum': 0.0, - 'labelname': {'de': 'Kontrast', 'en': 'Contrast'}}], + {'instances': + [{'info': {}, + 'familyname': 'VarLibTest', + 'filename': 'instance/VarLibTest-Medium.ufo', + 'kerning': {}, + 'location': {'weight': 0.5}, + 'stylename': 'Medium'}], - # masters (aka sources) - [{'info': {'copy': True}, - 'name': 'master_1', - 'lib': {'copy': True}, - 'filename': 'VarLibTest-Light.ufo', - 'location': {'weight': 0.0}, - 'groups': {'copy': True}}, - {'location': {'weight': 1.0}, - 'name': 'master_2', - 'filename': 'VarLibTest-Bold.ufo'}], + 'masters': + [{'info': {'copy': True}, + 'name': 'master_1', + 'lib': {'copy': True}, + 'filename': 'VarLibTest-Light.ufo', + 'location': {'weight': 0.0}, + 'groups': {'copy': True}}, + {'location': {'weight': 1.0}, + 'name': 'master_2', + 'filename': 'VarLibTest-Bold.ufo'}], - # instances - [{'info': {}, - 'familyname': 'VarLibTest', - 'filename': 'instance/VarLibTest-Medium.ufo', - 'kerning': {}, - 'location': {'weight': 0.5}, - 'stylename': 'Medium'}]) + 'axes': + [{'map': [{'input': 0.0, 'output': 10.0}, + {'input': 401.0, 'output': 66.0}, + {'input': 1000.0, 'output': 990.0}], + 'name': 'weight', + 'default': 0.0, + 'tag': 'wght', + 'maximum': 1000.0, + 'minimum': 0.0}, + {'default': 250.0, + 'minimum': 0.0, + 'tag': 'wdth', + 'maximum': 1000.0, + 'name': 'width'}, + {'name': 'contrast', + 'default': 0.0, + 'tag': 'cntr', + 'maximum': 100.0, + 'minimum': 0.0, + 'labelname': {'de': 'Kontrast', 'en': 'Contrast'}}] + } )