Skip to content
This repository was archived by the owner on Jan 28, 2019. It is now read-only.

Commit 42a3428

Browse files
committed
writeLayerContents: make sure bytes strings in layerOrder are decoded
looks like defcon LayerSet.newLayer does not ensure the 'name' argument is a unicode string, so serializing the layercontents.plist with the new ufoLib.plistlib may lead to the layer name being encoded as a <data> element instead of a <string>. Thanks Miguel for noticing this.
1 parent e15d56a commit 42a3428

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

Lib/ufoLib/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import shutil
44
from io import StringIO, BytesIO, open
55
from copy import deepcopy
6-
from fontTools.misc.py23 import basestring, unicode
6+
from fontTools.misc.py23 import basestring, unicode, tounicode
77
from ufoLib.glifLib import GlyphSet
88
from ufoLib.validators import *
99
from ufoLib.filenames import userNameToFileName
@@ -1109,6 +1109,8 @@ def writeLayerContents(self, layerOrder=None, validate=None):
11091109
for layerName in layerOrder:
11101110
if layerName is None:
11111111
layerName = DEFAULT_LAYER_NAME
1112+
else:
1113+
layerName = tounicode(layerName)
11121114
newOrder.append(layerName)
11131115
layerOrder = newOrder
11141116
else:

Lib/ufoLib/test/test_UFO3.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import unittest
66
import tempfile
77
from io import open
8+
from fontTools.misc.py23 import unicode
89
from ufoLib import UFOReader, UFOWriter, UFOLibError
910
from ufoLib.glifLib import GlifLibError
1011
from ufoLib import plistlib
@@ -4130,6 +4131,28 @@ def testRemoveDefaultLayer(self):
41304131
writer = UFOWriter(self.ufoPath)
41314132
self.assertRaises(UFOLibError, writer.deleteGlyphSet, "does not exist")
41324133

4134+
def testWriteAsciiLayerOrder(self):
4135+
self.makeUFO(
4136+
layerContents=[
4137+
["public.default", "glyphs"],
4138+
["layer 1", "glyphs.layer 1"],
4139+
["layer 2", "glyphs.layer 2"],
4140+
]
4141+
)
4142+
writer = UFOWriter(self.ufoPath)
4143+
# if passed bytes string, it'll be decoded to ASCII unicode string
4144+
writer.writeLayerContents(["public.default", "layer 2", b"layer 1"])
4145+
path = os.path.join(self.ufoPath, "layercontents.plist")
4146+
with open(path, "rb") as f:
4147+
result = plistlib.load(f)
4148+
expected = [
4149+
["public.default", "glyphs"],
4150+
["layer 2", "glyphs.layer 2"],
4151+
["layer 1", "glyphs.layer 1"],
4152+
]
4153+
self.assertEqual(expected, result)
4154+
for layerName, directory in result:
4155+
assert isinstance(layerName, unicode)
41334156

41344157
# -----
41354158
# /data

0 commit comments

Comments
 (0)