ufoLib meta: automated 2to3 conversion

This commit is contained in:
Adrien Tétar 2015-11-05 09:03:19 +00:00 committed by Denis Jacquerye
parent 2c2ffb97c0
commit 337ef3202b
15 changed files with 210 additions and 206 deletions

View File

@ -31,14 +31,14 @@ fontinfo.plist values between the possible format versions.
import os import os
import shutil import shutil
from cStringIO import StringIO from io import StringIO
import codecs import codecs
from copy import deepcopy from copy import deepcopy
from plistlib import readPlist, writePlist from .plistlib import readPlist, writePlist
from glifLib import GlyphSet, READ_MODE, WRITE_MODE from .glifLib import GlyphSet, READ_MODE, WRITE_MODE
from validators import * from .validators import *
from filenames import userNameToFileName from .filenames import userNameToFileName
from converters import convertUFO1OrUFO2KerningToUFO3Kerning from .converters import convertUFO1OrUFO2KerningToUFO3Kerning
try: try:
set set
@ -159,13 +159,13 @@ class UFOReader(object):
invalidFormatMessage = "groups.plist is not properly formatted." invalidFormatMessage = "groups.plist is not properly formatted."
if not isinstance(groups, dict): if not isinstance(groups, dict):
raise UFOLibError(invalidFormatMessage) raise UFOLibError(invalidFormatMessage)
for groupName, glyphList in groups.items(): for groupName, glyphList in list(groups.items()):
if not isinstance(groupName, basestring): if not isinstance(groupName, str):
raise UFOLibError(invalidFormatMessage) raise UFOLibError(invalidFormatMessage)
elif not isinstance(glyphList, list): elif not isinstance(glyphList, list):
raise UFOLibError(invalidFormatMessage) raise UFOLibError(invalidFormatMessage)
for glyphName in glyphList: for glyphName in glyphList:
if not isinstance(glyphName, basestring): if not isinstance(glyphName, str):
raise UFOLibError(invalidFormatMessage) raise UFOLibError(invalidFormatMessage)
self._upConvertedKerningData = dict( self._upConvertedKerningData = dict(
kerning={}, kerning={},
@ -320,7 +320,7 @@ class UFOReader(object):
infoDataToSet = _convertFontInfoDataVersion2ToVersion3(infoDataToSet) infoDataToSet = _convertFontInfoDataVersion2ToVersion3(infoDataToSet)
# version 2 # version 2
elif self._formatVersion == 2: elif self._formatVersion == 2:
for attr, dataValidationDict in fontInfoAttributesVersion2ValueData.items(): for attr, dataValidationDict in list(fontInfoAttributesVersion2ValueData.items()):
value = infoDict.get(attr) value = infoDict.get(attr)
if value is None: if value is None:
continue continue
@ -328,7 +328,7 @@ class UFOReader(object):
infoDataToSet = _convertFontInfoDataVersion2ToVersion3(infoDataToSet) infoDataToSet = _convertFontInfoDataVersion2ToVersion3(infoDataToSet)
# version 3 # version 3
elif self._formatVersion == 3: elif self._formatVersion == 3:
for attr, dataValidationDict in fontInfoAttributesVersion3ValueData.items(): for attr, dataValidationDict in list(fontInfoAttributesVersion3ValueData.items()):
value = infoDict.get(attr) value = infoDict.get(attr)
if value is None: if value is None:
continue continue
@ -339,7 +339,7 @@ class UFOReader(object):
# validate data # validate data
infoDataToSet = validateInfoVersion3Data(infoDataToSet) infoDataToSet = validateInfoVersion3Data(infoDataToSet)
# populate the object # populate the object
for attr, value in infoDataToSet.items(): for attr, value in list(infoDataToSet.items()):
try: try:
setattr(info, attr, value) setattr(info, attr, value)
except AttributeError: except AttributeError:
@ -352,13 +352,13 @@ class UFOReader(object):
invalidFormatMessage = "kerning.plist is not properly formatted." invalidFormatMessage = "kerning.plist is not properly formatted."
if not isinstance(data, dict): if not isinstance(data, dict):
raise UFOLibError(invalidFormatMessage) raise UFOLibError(invalidFormatMessage)
for first, secondDict in data.items(): for first, secondDict in list(data.items()):
if not isinstance(first, basestring): if not isinstance(first, str):
raise UFOLibError(invalidFormatMessage) raise UFOLibError(invalidFormatMessage)
elif not isinstance(secondDict, dict): elif not isinstance(secondDict, dict):
raise UFOLibError(invalidFormatMessage) raise UFOLibError(invalidFormatMessage)
for second, value in secondDict.items(): for second, value in list(secondDict.items()):
if not isinstance(second, basestring): if not isinstance(second, str):
raise UFOLibError(invalidFormatMessage) raise UFOLibError(invalidFormatMessage)
elif not isinstance(value, (int, float)): elif not isinstance(value, (int, float)):
raise UFOLibError(invalidFormatMessage) raise UFOLibError(invalidFormatMessage)
@ -480,7 +480,7 @@ class UFOReader(object):
glyphSet = self.getGlyphSet(layerName) glyphSet = self.getGlyphSet(layerName)
allUnicodes = glyphSet.getUnicodes() allUnicodes = glyphSet.getUnicodes()
cmap = {} cmap = {}
for glyphName, unicodes in allUnicodes.iteritems(): for glyphName, unicodes in allUnicodes.items():
for code in unicodes: for code in unicodes:
if code in cmap: if code in cmap:
cmap[code].append(glyphName) cmap[code].append(glyphName)
@ -806,7 +806,7 @@ class UFOWriter(object):
# flip the dictionaries # flip the dictionaries
remap = {} remap = {}
for side in ("side1", "side2"): for side in ("side1", "side2"):
for writeName, dataName in maps[side].items(): for writeName, dataName in list(maps[side].items()):
remap[dataName] = writeName remap[dataName] = writeName
self._downConversionKerningData = dict(groupRenameMap=remap) self._downConversionKerningData = dict(groupRenameMap=remap)
@ -835,11 +835,11 @@ class UFOWriter(object):
# to the same group name there is no check to # to the same group name there is no check to
# ensure that the contents are identical. that # ensure that the contents are identical. that
# is left up to the caller. # is left up to the caller.
for name, contents in groups.items(): for name, contents in list(groups.items()):
if name in remap: if name in remap:
continue continue
remappedGroups[name] = contents remappedGroups[name] = contents
for name, contents in groups.items(): for name, contents in list(groups.items()):
if name not in remap: if name not in remap:
continue continue
name = remap[name] name = remap[name]
@ -847,7 +847,7 @@ class UFOWriter(object):
groups = remappedGroups groups = remappedGroups
# pack and write # pack and write
groupsNew = {} groupsNew = {}
for key, value in groups.items(): for key, value in list(groups.items()):
groupsNew[key] = list(value) groupsNew[key] = list(value)
if groupsNew: if groupsNew:
self._writePlist(GROUPS_FILENAME, groupsNew) self._writePlist(GROUPS_FILENAME, groupsNew)
@ -866,7 +866,7 @@ class UFOWriter(object):
""" """
# gather version 3 data # gather version 3 data
infoData = {} infoData = {}
for attr in fontInfoAttributesVersion3ValueData.keys(): for attr in list(fontInfoAttributesVersion3ValueData.keys()):
if hasattr(info, attr): if hasattr(info, attr):
try: try:
value = getattr(info, attr) value = getattr(info, attr)
@ -904,14 +904,14 @@ class UFOWriter(object):
invalidFormatMessage = "The kerning is not properly formatted." invalidFormatMessage = "The kerning is not properly formatted."
if not isDictEnough(kerning): if not isDictEnough(kerning):
raise UFOLibError(invalidFormatMessage) raise UFOLibError(invalidFormatMessage)
for pair, value in kerning.items(): for pair, value in list(kerning.items()):
if not isinstance(pair, (list, tuple)): if not isinstance(pair, (list, tuple)):
raise UFOLibError(invalidFormatMessage) raise UFOLibError(invalidFormatMessage)
if not len(pair) == 2: if not len(pair) == 2:
raise UFOLibError(invalidFormatMessage) raise UFOLibError(invalidFormatMessage)
if not isinstance(pair[0], basestring): if not isinstance(pair[0], str):
raise UFOLibError(invalidFormatMessage) raise UFOLibError(invalidFormatMessage)
if not isinstance(pair[1], basestring): if not isinstance(pair[1], str):
raise UFOLibError(invalidFormatMessage) raise UFOLibError(invalidFormatMessage)
if not isinstance(value, (int, float)): if not isinstance(value, (int, float)):
raise UFOLibError(invalidFormatMessage) raise UFOLibError(invalidFormatMessage)
@ -919,14 +919,14 @@ class UFOWriter(object):
if self._formatVersion < 3 and self._downConversionKerningData is not None: if self._formatVersion < 3 and self._downConversionKerningData is not None:
remap = self._downConversionKerningData["groupRenameMap"] remap = self._downConversionKerningData["groupRenameMap"]
remappedKerning = {} remappedKerning = {}
for (side1, side2), value in kerning.items(): for (side1, side2), value in list(kerning.items()):
side1 = remap.get(side1, side1) side1 = remap.get(side1, side1)
side2 = remap.get(side2, side2) side2 = remap.get(side2, side2)
remappedKerning[side1, side2] = value remappedKerning[side1, side2] = value
kerning = remappedKerning kerning = remappedKerning
# pack and write # pack and write
kerningDict = {} kerningDict = {}
for left, right in kerning.keys(): for left, right in list(kerning.keys()):
value = kerning[left, right] value = kerning[left, right]
if not left in kerningDict: if not left in kerningDict:
kerningDict[left] = {} kerningDict[left] = {}
@ -960,7 +960,7 @@ class UFOWriter(object):
""" """
if self._formatVersion == 1: if self._formatVersion == 1:
raise UFOLibError("features.fea is not allowed in UFO Format Version 1.") raise UFOLibError("features.fea is not allowed in UFO Format Version 1.")
if not isinstance(features, basestring): if not isinstance(features, str):
raise UFOLibError("The features are not text.") raise UFOLibError("The features are not text.")
self._makeDirectory() self._makeDirectory()
path = os.path.join(self._path, FEATURES_FILENAME) path = os.path.join(self._path, FEATURES_FILENAME)
@ -999,7 +999,7 @@ class UFOWriter(object):
newOrder.append(layerName) newOrder.append(layerName)
layerOrder = newOrder layerOrder = newOrder
else: else:
layerOrder = self.layerContents.keys() layerOrder = list(self.layerContents.keys())
if set(layerOrder) != set(self.layerContents.keys()): if set(layerOrder) != set(self.layerContents.keys()):
raise UFOLibError("The layer order contents does not match the glyph sets that have been created.") raise UFOLibError("The layer order contents does not match the glyph sets that have been created.")
layerContents = [(layerName, self.layerContents[layerName]) for layerName in layerOrder] layerContents = [(layerName, self.layerContents[layerName]) for layerName in layerOrder]
@ -1007,7 +1007,7 @@ class UFOWriter(object):
def _findDirectoryForLayerName(self, layerName): def _findDirectoryForLayerName(self, layerName):
foundDirectory = None foundDirectory = None
for existingLayerName, directoryName in self.layerContents.items(): for existingLayerName, directoryName in list(self.layerContents.items()):
if layerName is None and directoryName == DEFAULT_GLYPHS_DIRNAME: if layerName is None and directoryName == DEFAULT_GLYPHS_DIRNAME:
foundDirectory = directoryName foundDirectory = directoryName
break break
@ -1032,7 +1032,7 @@ class UFOWriter(object):
raise UFOLibError("Only the default layer can be writen in UFO %d." % self.formatVersion) raise UFOLibError("Only the default layer can be writen in UFO %d." % self.formatVersion)
# locate a layer name when None has been given # locate a layer name when None has been given
if layerName is None and defaultLayer: if layerName is None and defaultLayer:
for existingLayerName, directory in self.layerContents.items(): for existingLayerName, directory in list(self.layerContents.items()):
if directory == DEFAULT_GLYPHS_DIRNAME: if directory == DEFAULT_GLYPHS_DIRNAME:
layerName = existingLayerName layerName = existingLayerName
if layerName is None: if layerName is None:
@ -1060,7 +1060,7 @@ class UFOWriter(object):
# matches the default being written. also make sure that this layer # matches the default being written. also make sure that this layer
# name is not already linked to a non-default layer. # name is not already linked to a non-default layer.
if defaultLayer: if defaultLayer:
for existingLayerName, directory in self.layerContents.items(): for existingLayerName, directory in list(self.layerContents.items()):
if directory == DEFAULT_GLYPHS_DIRNAME: if directory == DEFAULT_GLYPHS_DIRNAME:
if existingLayerName != layerName: if existingLayerName != layerName:
raise UFOLibError("Another layer is already mapped to the default directory.") raise UFOLibError("Another layer is already mapped to the default directory.")
@ -1076,10 +1076,10 @@ class UFOWriter(object):
else: else:
# not caching this could be slightly expensive, # not caching this could be slightly expensive,
# but caching it will be cumbersome # but caching it will be cumbersome
existing = [d.lower() for d in self.layerContents.values()] existing = [d.lower() for d in list(self.layerContents.values())]
if not isinstance(layerName, unicode): if not isinstance(layerName, str):
try: try:
layerName = unicode(layerName) layerName = str(layerName)
except UnicodeDecodeError: except UnicodeDecodeError:
raise UFOLibError("The specified layer name is not a Unicode string.") raise UFOLibError("The specified layer name is not a Unicode string.")
directory = userNameToFileName(layerName, existing=existing, prefix="glyphs.") directory = userNameToFileName(layerName, existing=existing, prefix="glyphs.")
@ -1118,14 +1118,14 @@ class UFOWriter(object):
if newLayerName in self.layerContents: if newLayerName in self.layerContents:
raise UFOLibError("A layer named %s already exists." % newLayerName) raise UFOLibError("A layer named %s already exists." % newLayerName)
# make sure the default layer doesn't already exist # make sure the default layer doesn't already exist
if defaultLayer and DEFAULT_GLYPHS_DIRNAME in self.layerContents.values(): if defaultLayer and DEFAULT_GLYPHS_DIRNAME in list(self.layerContents.values()):
raise UFOLibError("A default layer already exists.") raise UFOLibError("A default layer already exists.")
# get the paths # get the paths
oldDirectory = self._findDirectoryForLayerName(layerName) oldDirectory = self._findDirectoryForLayerName(layerName)
if defaultLayer: if defaultLayer:
newDirectory = DEFAULT_GLYPHS_DIRNAME newDirectory = DEFAULT_GLYPHS_DIRNAME
else: else:
existing = [name.lower() for name in self.layerContents.values()] existing = [name.lower() for name in list(self.layerContents.values())]
newDirectory = userNameToFileName(newLayerName, existing=existing, prefix="glyphs.") newDirectory = userNameToFileName(newLayerName, existing=existing, prefix="glyphs.")
# update the internal mapping # update the internal mapping
del self.layerContents[layerName] del self.layerContents[layerName]
@ -1341,7 +1341,7 @@ def validateInfoVersion2Data(infoData):
value is in the accepted range. value is in the accepted range.
""" """
validInfoData = {} validInfoData = {}
for attr, value in infoData.items(): for attr, value in list(infoData.items()):
isValidValue = validateFontInfoVersion2ValueForAttribute(attr, value) isValidValue = validateFontInfoVersion2ValueForAttribute(attr, value)
if not isValidValue: if not isValidValue:
raise UFOLibError("Invalid value for attribute %s (%s)." % (attr, repr(value))) raise UFOLibError("Invalid value for attribute %s (%s)." % (attr, repr(value)))
@ -1385,7 +1385,7 @@ def validateInfoVersion3Data(infoData):
value is in the accepted range. value is in the accepted range.
""" """
validInfoData = {} validInfoData = {}
for attr, value in infoData.items(): for attr, value in list(infoData.items()):
isValidValue = validateFontInfoVersion3ValueForAttribute(attr, value) isValidValue = validateFontInfoVersion3ValueForAttribute(attr, value)
if not isValidValue: if not isValidValue:
raise UFOLibError("Invalid value for attribute %s (%s)." % (attr, repr(value))) raise UFOLibError("Invalid value for attribute %s (%s)." % (attr, repr(value)))
@ -1395,10 +1395,10 @@ def validateInfoVersion3Data(infoData):
# Value Options # Value Options
fontInfoOpenTypeHeadFlagsOptions = range(0, 15) fontInfoOpenTypeHeadFlagsOptions = list(range(0, 15))
fontInfoOpenTypeOS2SelectionOptions = [1, 2, 3, 4, 7, 8, 9] fontInfoOpenTypeOS2SelectionOptions = [1, 2, 3, 4, 7, 8, 9]
fontInfoOpenTypeOS2UnicodeRangesOptions = range(0, 128) fontInfoOpenTypeOS2UnicodeRangesOptions = list(range(0, 128))
fontInfoOpenTypeOS2CodePageRangesOptions = range(0, 64) fontInfoOpenTypeOS2CodePageRangesOptions = list(range(0, 64))
fontInfoOpenTypeOS2TypeOptions = [0, 1, 2, 3, 8, 9] fontInfoOpenTypeOS2TypeOptions = [0, 1, 2, 3, 8, 9]
# Version Attribute Definitions # Version Attribute Definitions
@ -1450,23 +1450,23 @@ fontInfoAttributesVersion1 = set([
]) ])
fontInfoAttributesVersion2ValueData = { fontInfoAttributesVersion2ValueData = {
"familyName" : dict(type=basestring), "familyName" : dict(type=str),
"styleName" : dict(type=basestring), "styleName" : dict(type=str),
"styleMapFamilyName" : dict(type=basestring), "styleMapFamilyName" : dict(type=str),
"styleMapStyleName" : dict(type=basestring, valueValidator=fontInfoStyleMapStyleNameValidator), "styleMapStyleName" : dict(type=str, valueValidator=fontInfoStyleMapStyleNameValidator),
"versionMajor" : dict(type=int), "versionMajor" : dict(type=int),
"versionMinor" : dict(type=int), "versionMinor" : dict(type=int),
"year" : dict(type=int), "year" : dict(type=int),
"copyright" : dict(type=basestring), "copyright" : dict(type=str),
"trademark" : dict(type=basestring), "trademark" : dict(type=str),
"unitsPerEm" : dict(type=(int, float)), "unitsPerEm" : dict(type=(int, float)),
"descender" : dict(type=(int, float)), "descender" : dict(type=(int, float)),
"xHeight" : dict(type=(int, float)), "xHeight" : dict(type=(int, float)),
"capHeight" : dict(type=(int, float)), "capHeight" : dict(type=(int, float)),
"ascender" : dict(type=(int, float)), "ascender" : dict(type=(int, float)),
"italicAngle" : dict(type=(float, int)), "italicAngle" : dict(type=(float, int)),
"note" : dict(type=basestring), "note" : dict(type=str),
"openTypeHeadCreated" : dict(type=basestring, valueValidator=fontInfoOpenTypeHeadCreatedValidator), "openTypeHeadCreated" : dict(type=str, valueValidator=fontInfoOpenTypeHeadCreatedValidator),
"openTypeHeadLowestRecPPEM" : dict(type=(int, float)), "openTypeHeadLowestRecPPEM" : dict(type=(int, float)),
"openTypeHeadFlags" : dict(type="integerList", valueValidator=genericIntListValidator, valueOptions=fontInfoOpenTypeHeadFlagsOptions), "openTypeHeadFlags" : dict(type="integerList", valueValidator=genericIntListValidator, valueOptions=fontInfoOpenTypeHeadFlagsOptions),
"openTypeHheaAscender" : dict(type=(int, float)), "openTypeHheaAscender" : dict(type=(int, float)),
@ -1475,25 +1475,25 @@ fontInfoAttributesVersion2ValueData = {
"openTypeHheaCaretSlopeRise" : dict(type=int), "openTypeHheaCaretSlopeRise" : dict(type=int),
"openTypeHheaCaretSlopeRun" : dict(type=int), "openTypeHheaCaretSlopeRun" : dict(type=int),
"openTypeHheaCaretOffset" : dict(type=(int, float)), "openTypeHheaCaretOffset" : dict(type=(int, float)),
"openTypeNameDesigner" : dict(type=basestring), "openTypeNameDesigner" : dict(type=str),
"openTypeNameDesignerURL" : dict(type=basestring), "openTypeNameDesignerURL" : dict(type=str),
"openTypeNameManufacturer" : dict(type=basestring), "openTypeNameManufacturer" : dict(type=str),
"openTypeNameManufacturerURL" : dict(type=basestring), "openTypeNameManufacturerURL" : dict(type=str),
"openTypeNameLicense" : dict(type=basestring), "openTypeNameLicense" : dict(type=str),
"openTypeNameLicenseURL" : dict(type=basestring), "openTypeNameLicenseURL" : dict(type=str),
"openTypeNameVersion" : dict(type=basestring), "openTypeNameVersion" : dict(type=str),
"openTypeNameUniqueID" : dict(type=basestring), "openTypeNameUniqueID" : dict(type=str),
"openTypeNameDescription" : dict(type=basestring), "openTypeNameDescription" : dict(type=str),
"openTypeNamePreferredFamilyName" : dict(type=basestring), "openTypeNamePreferredFamilyName" : dict(type=str),
"openTypeNamePreferredSubfamilyName" : dict(type=basestring), "openTypeNamePreferredSubfamilyName" : dict(type=str),
"openTypeNameCompatibleFullName" : dict(type=basestring), "openTypeNameCompatibleFullName" : dict(type=str),
"openTypeNameSampleText" : dict(type=basestring), "openTypeNameSampleText" : dict(type=str),
"openTypeNameWWSFamilyName" : dict(type=basestring), "openTypeNameWWSFamilyName" : dict(type=str),
"openTypeNameWWSSubfamilyName" : dict(type=basestring), "openTypeNameWWSSubfamilyName" : dict(type=str),
"openTypeOS2WidthClass" : dict(type=int, valueValidator=fontInfoOpenTypeOS2WidthClassValidator), "openTypeOS2WidthClass" : dict(type=int, valueValidator=fontInfoOpenTypeOS2WidthClassValidator),
"openTypeOS2WeightClass" : dict(type=int, valueValidator=fontInfoOpenTypeOS2WeightClassValidator), "openTypeOS2WeightClass" : dict(type=int, valueValidator=fontInfoOpenTypeOS2WeightClassValidator),
"openTypeOS2Selection" : dict(type="integerList", valueValidator=genericIntListValidator, valueOptions=fontInfoOpenTypeOS2SelectionOptions), "openTypeOS2Selection" : dict(type="integerList", valueValidator=genericIntListValidator, valueOptions=fontInfoOpenTypeOS2SelectionOptions),
"openTypeOS2VendorID" : dict(type=basestring), "openTypeOS2VendorID" : dict(type=str),
"openTypeOS2Panose" : dict(type="integerList", valueValidator=fontInfoVersion2OpenTypeOS2PanoseValidator), "openTypeOS2Panose" : dict(type="integerList", valueValidator=fontInfoVersion2OpenTypeOS2PanoseValidator),
"openTypeOS2FamilyClass" : dict(type="integerList", valueValidator=fontInfoOpenTypeOS2FamilyClassValidator), "openTypeOS2FamilyClass" : dict(type="integerList", valueValidator=fontInfoOpenTypeOS2FamilyClassValidator),
"openTypeOS2UnicodeRanges" : dict(type="integerList", valueValidator=genericIntListValidator, valueOptions=fontInfoOpenTypeOS2UnicodeRangesOptions), "openTypeOS2UnicodeRanges" : dict(type="integerList", valueValidator=genericIntListValidator, valueOptions=fontInfoOpenTypeOS2UnicodeRangesOptions),
@ -1520,8 +1520,8 @@ fontInfoAttributesVersion2ValueData = {
"openTypeVheaCaretSlopeRise" : dict(type=int), "openTypeVheaCaretSlopeRise" : dict(type=int),
"openTypeVheaCaretSlopeRun" : dict(type=int), "openTypeVheaCaretSlopeRun" : dict(type=int),
"openTypeVheaCaretOffset" : dict(type=(int, float)), "openTypeVheaCaretOffset" : dict(type=(int, float)),
"postscriptFontName" : dict(type=basestring), "postscriptFontName" : dict(type=str),
"postscriptFullName" : dict(type=basestring), "postscriptFullName" : dict(type=str),
"postscriptSlantAngle" : dict(type=(float, int)), "postscriptSlantAngle" : dict(type=(float, int)),
"postscriptUniqueID" : dict(type=int), "postscriptUniqueID" : dict(type=int),
"postscriptUnderlineThickness" : dict(type=(int, float)), "postscriptUnderlineThickness" : dict(type=(int, float)),
@ -1539,11 +1539,11 @@ fontInfoAttributesVersion2ValueData = {
"postscriptForceBold" : dict(type=bool), "postscriptForceBold" : dict(type=bool),
"postscriptDefaultWidthX" : dict(type=(int, float)), "postscriptDefaultWidthX" : dict(type=(int, float)),
"postscriptNominalWidthX" : dict(type=(int, float)), "postscriptNominalWidthX" : dict(type=(int, float)),
"postscriptWeightName" : dict(type=basestring), "postscriptWeightName" : dict(type=str),
"postscriptDefaultCharacter" : dict(type=basestring), "postscriptDefaultCharacter" : dict(type=str),
"postscriptWindowsCharacterSet" : dict(type=int, valueValidator=fontInfoPostscriptWindowsCharacterSetValidator), "postscriptWindowsCharacterSet" : dict(type=int, valueValidator=fontInfoPostscriptWindowsCharacterSetValidator),
"macintoshFONDFamilyID" : dict(type=int), "macintoshFONDFamilyID" : dict(type=int),
"macintoshFONDName" : dict(type=basestring), "macintoshFONDName" : dict(type=str),
} }
fontInfoAttributesVersion2 = set(fontInfoAttributesVersion2ValueData.keys()) fontInfoAttributesVersion2 = set(fontInfoAttributesVersion2ValueData.keys())
@ -1595,11 +1595,11 @@ fontInfoAttributesVersion3 = set(fontInfoAttributesVersion3ValueData.keys())
# insert the type validator for all attrs that # insert the type validator for all attrs that
# have no defined validator. # have no defined validator.
for attr, dataDict in fontInfoAttributesVersion2ValueData.items(): for attr, dataDict in list(fontInfoAttributesVersion2ValueData.items()):
if "valueValidator" not in dataDict: if "valueValidator" not in dataDict:
dataDict["valueValidator"] = genericTypeValidator dataDict["valueValidator"] = genericTypeValidator
for attr, dataDict in fontInfoAttributesVersion3ValueData.items(): for attr, dataDict in list(fontInfoAttributesVersion3ValueData.items()):
if "valueValidator" not in dataDict: if "valueValidator" not in dataDict:
dataDict["valueValidator"] = genericTypeValidator dataDict["valueValidator"] = genericTypeValidator
@ -1609,7 +1609,7 @@ for attr, dataDict in fontInfoAttributesVersion3ValueData.items():
def _flipDict(d): def _flipDict(d):
flipped = {} flipped = {}
for key, value in d.items(): for key, value in list(d.items()):
flipped[value] = key flipped[value] = key
return flipped return flipped
@ -1751,7 +1751,7 @@ def convertFontInfoValueForAttributeFromVersion2ToVersion1(attr, value):
def _convertFontInfoDataVersion1ToVersion2(data): def _convertFontInfoDataVersion1ToVersion2(data):
converted = {} converted = {}
for attr, value in data.items(): for attr, value in list(data.items()):
# FontLab gives -1 for the weightValue # FontLab gives -1 for the weightValue
# for fonts wil no defined value. Many # for fonts wil no defined value. Many
# format version 1 UFOs will have this. # format version 1 UFOs will have this.
@ -1770,7 +1770,7 @@ def _convertFontInfoDataVersion1ToVersion2(data):
def _convertFontInfoDataVersion2ToVersion1(data): def _convertFontInfoDataVersion2ToVersion1(data):
converted = {} converted = {}
for attr, value in data.items(): for attr, value in list(data.items()):
newAttr, newValue = convertFontInfoValueForAttributeFromVersion2ToVersion1(attr, value) newAttr, newValue = convertFontInfoValueForAttributeFromVersion2ToVersion1(attr, value)
# only take attributes that are registered for version 1 # only take attributes that are registered for version 1
if newAttr not in fontInfoAttributesVersion1: if newAttr not in fontInfoAttributesVersion1:
@ -1861,7 +1861,7 @@ def convertFontInfoValueForAttributeFromVersion3ToVersion2(attr, value):
def _convertFontInfoDataVersion3ToVersion2(data): def _convertFontInfoDataVersion3ToVersion2(data):
converted = {} converted = {}
for attr, value in data.items(): for attr, value in list(data.items()):
newAttr, newValue = convertFontInfoValueForAttributeFromVersion3ToVersion2(attr, value) newAttr, newValue = convertFontInfoValueForAttributeFromVersion3ToVersion2(attr, value)
if newAttr not in fontInfoAttributesVersion2: if newAttr not in fontInfoAttributesVersion2:
continue continue
@ -1870,7 +1870,7 @@ def _convertFontInfoDataVersion3ToVersion2(data):
def _convertFontInfoDataVersion2ToVersion3(data): def _convertFontInfoDataVersion2ToVersion3(data):
converted = {} converted = {}
for attr, value in data.items(): for attr, value in list(data.items()):
attr, value = convertFontInfoValueForAttributeFromVersion2ToVersion3(attr, value) attr, value = convertFontInfoValueForAttributeFromVersion2ToVersion3(attr, value)
converted[attr] = value converted[attr] = value
return converted return converted

View File

@ -8,11 +8,11 @@ def convertUFO1OrUFO2KerningToUFO3Kerning(kerning, groups):
# gather known kerning groups based on the prefixes # gather known kerning groups based on the prefixes
firstReferencedGroups, secondReferencedGroups = findKnownKerningGroups(groups) firstReferencedGroups, secondReferencedGroups = findKnownKerningGroups(groups)
# Make lists of groups referenced in kerning pairs. # Make lists of groups referenced in kerning pairs.
for first, seconds in kerning.items(): for first, seconds in list(kerning.items()):
if first in groups: if first in groups:
if not first.startswith("public.kern1."): if not first.startswith("public.kern1."):
firstReferencedGroups.add(first) firstReferencedGroups.add(first)
for second in seconds.keys(): for second in list(seconds.keys()):
if second in groups: if second in groups:
if not second.startswith("public.kern2."): if not second.startswith("public.kern2."):
secondReferencedGroups.add(second) secondReferencedGroups.add(second)
@ -20,7 +20,7 @@ def convertUFO1OrUFO2KerningToUFO3Kerning(kerning, groups):
firstRenamedGroups = {} firstRenamedGroups = {}
for first in firstReferencedGroups: for first in firstReferencedGroups:
# Make a list of existing group names. # Make a list of existing group names.
existingGroupNames = groups.keys() + firstRenamedGroups.keys() existingGroupNames = list(groups.keys()) + list(firstRenamedGroups.keys())
# Add the prefix to the name. # Add the prefix to the name.
newName = "public.kern1." + first newName = "public.kern1." + first
# Make a unique group name. # Make a unique group name.
@ -30,7 +30,7 @@ def convertUFO1OrUFO2KerningToUFO3Kerning(kerning, groups):
secondRenamedGroups = {} secondRenamedGroups = {}
for second in secondReferencedGroups: for second in secondReferencedGroups:
# Make a list of existing group names. # Make a list of existing group names.
existingGroupNames = groups.keys() + secondRenamedGroups.keys() existingGroupNames = list(groups.keys()) + list(secondRenamedGroups.keys())
# Add the prefix to the name. # Add the prefix to the name.
newName = "public.kern2." + second newName = "public.kern2." + second
# Make a unique group name. # Make a unique group name.
@ -39,17 +39,17 @@ def convertUFO1OrUFO2KerningToUFO3Kerning(kerning, groups):
secondRenamedGroups[second] = newName secondRenamedGroups[second] = newName
# Populate the new group names into the kerning dictionary as needed. # Populate the new group names into the kerning dictionary as needed.
newKerning = {} newKerning = {}
for first, seconds in kerning.items(): for first, seconds in list(kerning.items()):
first = firstRenamedGroups.get(first, first) first = firstRenamedGroups.get(first, first)
newSeconds = {} newSeconds = {}
for second, value in seconds.items(): for second, value in list(seconds.items()):
second = secondRenamedGroups.get(second, second) second = secondRenamedGroups.get(second, second)
newSeconds[second] = value newSeconds[second] = value
newKerning[first] = newSeconds newKerning[first] = newSeconds
# Make copies of the referenced groups and store them # Make copies of the referenced groups and store them
# under the new names in the overall groups dictionary. # under the new names in the overall groups dictionary.
allRenamedGroups = firstRenamedGroups.items() allRenamedGroups = list(firstRenamedGroups.items())
allRenamedGroups += secondRenamedGroups.items() allRenamedGroups += list(secondRenamedGroups.items())
for oldName, newName in allRenamedGroups: for oldName, newName in allRenamedGroups:
group = list(groups[oldName]) group = list(groups[oldName])
groups[newName] = group groups[newName] = group
@ -95,7 +95,7 @@ def findKnownKerningGroups(groups):
] ]
firstGroups = set() firstGroups = set()
secondGroups = set() secondGroups = set()
for groupName in groups.keys(): for groupName in list(groups.keys()):
for firstPrefix in knownFirstGroupPrefixes: for firstPrefix in knownFirstGroupPrefixes:
if groupName.startswith(firstPrefix): if groupName.startswith(firstPrefix):
firstGroups.add(groupName) firstGroups.add(groupName)

View File

@ -66,7 +66,7 @@ def userNameToFileName(userName, existing=[], prefix="", suffix=""):
u'alt._con' u'alt._con'
""" """
# the incoming name must be a unicode string # the incoming name must be a unicode string
assert isinstance(userName, unicode), "The value for userName must be a unicode string." assert isinstance(userName, str), "The value for userName must be a unicode string."
# establish the prefix and suffix lengths # establish the prefix and suffix lengths
prefixLength = len(prefix) prefixLength = len(prefix)
suffixLength = len(suffix) suffixLength = len(suffix)

View File

@ -12,13 +12,13 @@ glyph data. See the class doc string for details.
""" """
import os import os
from cStringIO import StringIO from io import StringIO
from warnings import warn from warnings import warn
from xmlTreeBuilder import buildTree, stripCharacterData from .xmlTreeBuilder import buildTree, stripCharacterData
from ufoLib.pointPen import AbstractPointPen from ufoLib.pointPen import AbstractPointPen
from plistlib import readPlist, writePlistToString from .plistlib import readPlist, writePlistToString
from filenames import userNameToFileName from .filenames import userNameToFileName
from validators import isDictEnough, genericTypeValidator, colorValidator,\ from .validators import isDictEnough, genericTypeValidator, colorValidator,\
guidelinesValidator, anchorsValidator, identifierValidator, imageValidator, glyphLibValidator guidelinesValidator, anchorsValidator, identifierValidator, imageValidator, glyphLibValidator
try: try:
@ -144,10 +144,10 @@ class GlyphSet(object):
if not isinstance(contents, dict): if not isinstance(contents, dict):
invalidFormat = True invalidFormat = True
else: else:
for name, fileName in contents.items(): for name, fileName in list(contents.items()):
if not isinstance(name, basestring): if not isinstance(name, str):
invalidFormat = True invalidFormat = True
if not isinstance(fileName, basestring): if not isinstance(fileName, str):
invalidFormat = True invalidFormat = True
elif not os.path.exists(os.path.join(self.dirName, fileName)): elif not os.path.exists(os.path.join(self.dirName, fileName)):
raise GlifLibError("contents.plist references a file that does not exist: %s" % fileName) raise GlifLibError("contents.plist references a file that does not exist: %s" % fileName)
@ -167,7 +167,7 @@ class GlyphSet(object):
""" """
if self._reverseContents is None: if self._reverseContents is None:
d = {} d = {}
for k, v in self.contents.iteritems(): for k, v in self.contents.items():
d[v.lower()] = k d[v.lower()] = k
self._reverseContents = d self._reverseContents = d
return self._reverseContents return self._reverseContents
@ -196,7 +196,7 @@ class GlyphSet(object):
raise GlifLibError("layerinfo.plist is not properly formatted.") raise GlifLibError("layerinfo.plist is not properly formatted.")
infoDict = validateLayerInfoVersion3Data(infoDict) infoDict = validateLayerInfoVersion3Data(infoDict)
# populate the object # populate the object
for attr, value in infoDict.items(): for attr, value in list(infoDict.items()):
try: try:
setattr(info, attr, value) setattr(info, attr, value)
except AttributeError: except AttributeError:
@ -207,7 +207,7 @@ class GlyphSet(object):
raise GlifLibError("layerinfo.plist is not allowed in UFO %d." % self.ufoFormatVersion) raise GlifLibError("layerinfo.plist is not allowed in UFO %d." % self.ufoFormatVersion)
# gather data # gather data
infoData = {} infoData = {}
for attr in layerInfoVersion3ValueData.keys(): for attr in list(layerInfoVersion3ValueData.keys()):
if hasattr(info, attr): if hasattr(info, attr):
try: try:
value = getattr(info, attr) value = getattr(info, attr)
@ -255,7 +255,7 @@ class GlyphSet(object):
if needRead: if needRead:
fileName = self.contents[glyphName] fileName = self.contents[glyphName]
if not os.path.exists(path): if not os.path.exists(path):
raise KeyError, glyphName raise KeyError(glyphName)
f = open(path, "rb") f = open(path, "rb")
text = f.read() text = f.read()
f.close() f.close()
@ -385,7 +385,7 @@ class GlyphSet(object):
# dict-like support # dict-like support
def keys(self): def keys(self):
return self.contents.keys() return list(self.contents.keys())
def has_key(self, glyphName): def has_key(self, glyphName):
return glyphName in self.contents return glyphName in self.contents
@ -397,7 +397,7 @@ class GlyphSet(object):
def __getitem__(self, glyphName): def __getitem__(self, glyphName):
if glyphName not in self.contents: if glyphName not in self.contents:
raise KeyError, glyphName raise KeyError(glyphName)
return self.glyphClass(glyphName, self) return self.glyphClass(glyphName, self)
# quickly fetch unicode values # quickly fetch unicode values
@ -411,7 +411,7 @@ class GlyphSet(object):
""" """
unicodes = {} unicodes = {}
if glyphNames is None: if glyphNames is None:
glyphNames = self.contents.keys() glyphNames = list(self.contents.keys())
for glyphName in glyphNames: for glyphName in glyphNames:
text = self.getGLIF(glyphName) text = self.getGLIF(glyphName)
unicodes[glyphName] = _fetchUnicodes(text) unicodes[glyphName] = _fetchUnicodes(text)
@ -426,7 +426,7 @@ class GlyphSet(object):
""" """
components = {} components = {}
if glyphNames is None: if glyphNames is None:
glyphNames = self.contents.keys() glyphNames = list(self.contents.keys())
for glyphName in glyphNames: for glyphName in glyphNames:
text = self.getGLIF(glyphName) text = self.getGLIF(glyphName)
components[glyphName] = _fetchComponentBases(text) components[glyphName] = _fetchComponentBases(text)
@ -441,7 +441,7 @@ class GlyphSet(object):
""" """
images = {} images = {}
if glyphNames is None: if glyphNames is None:
glyphNames = self.contents.keys() glyphNames = list(self.contents.keys())
for glyphName in glyphNames: for glyphName in glyphNames:
text = self.getGLIF(glyphName) text = self.getGLIF(glyphName)
images[glyphName] = _fetchImageFileName(text) images[glyphName] = _fetchImageFileName(text)
@ -465,10 +465,10 @@ def glyphNameToFileName(glyphName, glyphSet):
""" """
Wrapper around the userNameToFileName function in filenames.py Wrapper around the userNameToFileName function in filenames.py
""" """
existing = [name.lower() for name in glyphSet.contents.values()] existing = [name.lower() for name in list(glyphSet.contents.values())]
if not isinstance(glyphName, unicode): if not isinstance(glyphName, str):
try: try:
new = unicode(glyphName) new = str(glyphName)
glyphName = new glyphName = new
except UnicodeDecodeError: except UnicodeDecodeError:
pass pass
@ -552,7 +552,7 @@ def writeGlyphToString(glyphName, glyphObject=None, drawPointsFunc=None, writer=
aFile = None aFile = None
identifiers = set() identifiers = set()
# start # start
if not isinstance(glyphName, basestring): if not isinstance(glyphName, str):
raise GlifLibError("The glyph name is not properly formatted.") raise GlifLibError("The glyph name is not properly formatted.")
if len(glyphName) == 0: if len(glyphName) == 0:
raise GlifLibError("The glyph name is empty.") raise GlifLibError("The glyph name is empty.")
@ -566,7 +566,7 @@ def writeGlyphToString(glyphName, glyphObject=None, drawPointsFunc=None, writer=
n = glyphName.encode("utf8") n = glyphName.encode("utf8")
utf8GlyphName = n utf8GlyphName = n
except UnicodeEncodeError: except UnicodeEncodeError:
raise GlifLibError(u"encountered a glyph name (%s) that can't be converted to UTF-8." % glyphName) raise GlifLibError("encountered a glyph name (%s) that can't be converted to UTF-8." % glyphName)
writer.begintag("glyph", [("name", utf8GlyphName), ("format", formatVersion)]) writer.begintag("glyph", [("name", utf8GlyphName), ("format", formatVersion)])
writer.newline() writer.newline()
# advance # advance
@ -651,7 +651,7 @@ def _writeUnicodes(glyphObject, writer):
def _writeNote(glyphObject, writer): def _writeNote(glyphObject, writer):
note = getattr(glyphObject, "note", None) note = getattr(glyphObject, "note", None)
if not isinstance(note, (str, unicode)): if not isinstance(note, str):
raise GlifLibError("note attribute must be str or unicode") raise GlifLibError("note attribute must be str or unicode")
note = note.encode("utf-8") note = note.encode("utf-8")
writer.begintag("note") writer.begintag("note")
@ -771,7 +771,7 @@ def _writeLib(glyphObject, writer):
# ----------------------- # -----------------------
layerInfoVersion3ValueData = { layerInfoVersion3ValueData = {
"color" : dict(type=basestring, valueValidator=colorValidator), "color" : dict(type=str, valueValidator=colorValidator),
"lib" : dict(type=dict, valueValidator=genericTypeValidator) "lib" : dict(type=dict, valueValidator=genericTypeValidator)
} }
@ -813,7 +813,7 @@ def validateLayerInfoVersion3Data(infoData):
value is in the accepted range. value is in the accepted range.
""" """
validInfoData = {} validInfoData = {}
for attr, value in infoData.items(): for attr, value in list(infoData.items()):
if attr not in layerInfoVersion3ValueData: if attr not in layerInfoVersion3ValueData:
raise GlifLibError("Unknown attribute %s." % attr) raise GlifLibError("Unknown attribute %s." % attr)
isValidValue = validateLayerInfoVersion3ValueForAttribute(attr, value) isValidValue = validateLayerInfoVersion3ValueForAttribute(attr, value)
@ -1018,7 +1018,7 @@ def _readNote(glyphObject, children):
_relaxedSetattr(glyphObject, "note", note) _relaxedSetattr(glyphObject, "note", note)
def _readLib(glyphObject, children): def _readLib(glyphObject, children):
from plistFromTree import readPlistFromTree from .plistFromTree import readPlistFromTree
assert len(children) == 1 assert len(children) == 1
lib = readPlistFromTree(children[0]) lib = readPlistFromTree(children[0])
valid, message = glyphLibValidator(lib) valid, message = glyphLibValidator(lib)
@ -1097,7 +1097,8 @@ def _buildAnchorFormat1(point):
anchor = dict(x=x, y=y, name=name) anchor = dict(x=x, y=y, name=name)
return anchor return anchor
def _buildOutlineContourFormat1(pen, (attrs, children)): def _buildOutlineContourFormat1(pen, xxx_todo_changeme):
(attrs, children) = xxx_todo_changeme
if set(attrs.keys()): if set(attrs.keys()):
raise GlifLibError("Unknown attributes in contour element.") raise GlifLibError("Unknown attributes in contour element.")
pen.beginPath() pen.beginPath()
@ -1115,7 +1116,8 @@ def _buildOutlinePointsFormat1(pen, children):
name = attrs["name"] name = attrs["name"]
pen.addPoint((x, y), segmentType=segmentType, smooth=smooth, name=name) pen.addPoint((x, y), segmentType=segmentType, smooth=smooth, name=name)
def _buildOutlineComponentFormat1(pen, (attrs, children)): def _buildOutlineComponentFormat1(pen, xxx_todo_changeme1):
(attrs, children) = xxx_todo_changeme1
if len(children): if len(children):
raise GlifLibError("Unknown child elements of component element." % subElement) raise GlifLibError("Unknown child elements of component element." % subElement)
if set(attrs.keys()) - componentAttributesFormat1: if set(attrs.keys()) - componentAttributesFormat1:
@ -1148,7 +1150,8 @@ def buildOutlineFormat2(glyphObject, pen, xmlNodes, identifiers):
else: else:
raise GlifLibError("Unknown element in outline element: %s" % element) raise GlifLibError("Unknown element in outline element: %s" % element)
def _buildOutlineContourFormat2(pen, (attrs, children), identifiers): def _buildOutlineContourFormat2(pen, xxx_todo_changeme2, identifiers):
(attrs, children) = xxx_todo_changeme2
if set(attrs.keys()) - contourAttributesFormat2: if set(attrs.keys()) - contourAttributesFormat2:
raise GlifLibError("Unknown attributes in contour element.") raise GlifLibError("Unknown attributes in contour element.")
identifier = attrs.get("identifier") identifier = attrs.get("identifier")
@ -1188,7 +1191,8 @@ def _buildOutlinePointsFormat2(pen, children, identifiers):
pen.addPoint((x, y), segmentType=segmentType, smooth=smooth, name=name) pen.addPoint((x, y), segmentType=segmentType, smooth=smooth, name=name)
raise warn("The addPoint method needs an identifier kwarg. The point's identifier value has been discarded.", DeprecationWarning) raise warn("The addPoint method needs an identifier kwarg. The point's identifier value has been discarded.", DeprecationWarning)
def _buildOutlineComponentFormat2(pen, (attrs, children), identifiers): def _buildOutlineComponentFormat2(pen, xxx_todo_changeme3, identifiers):
(attrs, children) = xxx_todo_changeme3
if len(children): if len(children):
raise GlifLibError("Unknown child elements of component element." % subElement) raise GlifLibError("Unknown child elements of component element." % subElement)
if set(attrs.keys()) - componentAttributesFormat2: if set(attrs.keys()) - componentAttributesFormat2:
@ -1232,7 +1236,7 @@ def _validateAndMassagePointStructures(children, pointAttributes, openContourOff
if subElement != "point": if subElement != "point":
raise GlifLibError("Unknown child element (%s) of contour element." % subElement) raise GlifLibError("Unknown child element (%s) of contour element." % subElement)
# unknown attributes # unknown attributes
unknownAttributes = [attr for attr in attrs.keys() if attr not in pointAttributes] unknownAttributes = [attr for attr in list(attrs.keys()) if attr not in pointAttributes]
if unknownAttributes: if unknownAttributes:
raise GlifLibError("Unknown attributes in point element.") raise GlifLibError("Unknown attributes in point element.")
# search for unknown children # search for unknown children

View File

@ -6,7 +6,7 @@ by xmlTreeBuilder.
__all__ = "readPlistFromTree" __all__ = "readPlistFromTree"
from plistlib import PlistParser from .plistlib import PlistParser
def readPlistFromTree(tree): def readPlistFromTree(tree):
@ -30,14 +30,14 @@ class PlistTreeParser(PlistParser):
if isinstance(child, tuple): if isinstance(child, tuple):
self.parseElement(child[0], child[1], child[2]) self.parseElement(child[0], child[1], child[2])
else: else:
if not isinstance(child, unicode): if not isinstance(child, str):
# ugh, xmlTreeBuilder returns utf-8 :-( # ugh, xmlTreeBuilder returns utf-8 :-(
child = unicode(child, "utf-8") child = str(child, "utf-8")
self.handleData(child) self.handleData(child)
self.handleEndElement(element) self.handleEndElement(element)
if __name__ == "__main__": if __name__ == "__main__":
from xmlTreeBuilder import buildTree from .xmlTreeBuilder import buildTree
tree = buildTree("xxx.plist", stripData=0) tree = buildTree("xxx.plist", stripData=0)
print readPlistFromTree(tree) print(readPlistFromTree(tree))

View File

@ -28,7 +28,7 @@ def _gatherTestCasesFromCallerByMagic():
def _gatherTestCasesFromDict(d): def _gatherTestCasesFromDict(d):
testCases = [] testCases = []
for ob in d.values(): for ob in list(d.values()):
if isinstance(ob, type) and issubclass(ob, unittest.TestCase): if isinstance(ob, type) and issubclass(ob, unittest.TestCase):
testCases.append(ob) testCases.append(ob)
return testCases return testCases
@ -90,7 +90,7 @@ class Glyph(object):
def drawPoints(self, pointPen): def drawPoints(self, pointPen):
if self.outline: if self.outline:
py = "\n".join(self.outline) py = "\n".join(self.outline)
exec py in {"pointPen" : pointPen} exec(py, {"pointPen" : pointPen})
def py(self): def py(self):
text = [] text = []
@ -130,7 +130,7 @@ def _dictToString(d):
value = _tupleToString(value) value = _tupleToString(value)
elif isinstance(value, (int, float)): elif isinstance(value, (int, float)):
value = str(value) value = str(value)
elif isinstance(value, basestring): elif isinstance(value, str):
value = "\"%s\"" % value value = "\"%s\"" % value
text.append("%s : %s" % (key, value)) text.append("%s : %s" % (key, value))
if not text: if not text:
@ -148,7 +148,7 @@ def _listToString(l):
value = _tupleToString(value) value = _tupleToString(value)
elif isinstance(value, (int, float)): elif isinstance(value, (int, float)):
value = str(value) value = str(value)
elif isinstance(value, basestring): elif isinstance(value, str):
value = "\"%s\"" % value value = "\"%s\"" % value
text.append(value) text.append(value)
if not text: if not text:
@ -166,7 +166,7 @@ def _tupleToString(t):
value = _tupleToString(value) value = _tupleToString(value)
elif isinstance(value, (int, float)): elif isinstance(value, (int, float)):
value = str(value) value = str(value)
elif isinstance(value, basestring): elif isinstance(value, str):
value = "\"%s\"" % value value = "\"%s\"" % value
text.append(value) text.append(value)
if not text: if not text:
@ -586,8 +586,8 @@ fontInfoVersion3 = {
# identifier # identifier
dict(x=100, y=200, angle=45, identifier="guide1"), dict(x=100, y=200, angle=45, identifier="guide1"),
dict(x=100, y=200, angle=45, identifier="guide2"), dict(x=100, y=200, angle=45, identifier="guide2"),
dict(x=100, y=200, angle=45, identifier=u"\x20"), dict(x=100, y=200, angle=45, identifier="\x20"),
dict(x=100, y=200, angle=45, identifier=u"\x7E"), dict(x=100, y=200, angle=45, identifier="\x7E"),
# colors # colors
dict(x=100, y=200, angle=45, color="0,0,0,0"), dict(x=100, y=200, angle=45, color="0,0,0,0"),
dict(x=100, y=200, angle=45, color="1,0,0,0"), dict(x=100, y=200, angle=45, color="1,0,0,0"),

View File

@ -9,16 +9,16 @@ from ufoLib.test.testSupport import Glyph, stripText
class TestGLIF1(unittest.TestCase): class TestGLIF1(unittest.TestCase):
def assertEqual(self, first, second, msg=None): def assertEqual(self, first, second, msg=None):
if isinstance(first, basestring): if isinstance(first, str):
first = stripText(first) first = stripText(first)
if isinstance(second, basestring): if isinstance(second, str):
second = stripText(second) second = stripText(second)
return super(TestGLIF1, self).assertEqual(first, second, msg=msg) return super(TestGLIF1, self).assertEqual(first, second, msg=msg)
def pyToGLIF(self, py): def pyToGLIF(self, py):
py = stripText(py) py = stripText(py)
glyph = Glyph() glyph = Glyph()
exec py in {"glyph" : glyph, "pointPen" : glyph} exec(py, {"glyph" : glyph, "pointPen" : glyph})
glif = writeGlyphToString(glyph.name, glyphObject=glyph, drawPointsFunc=glyph.drawPoints, formatVersion=1) glif = writeGlyphToString(glyph.name, glyphObject=glyph, drawPointsFunc=glyph.drawPoints, formatVersion=1)
glif = "\n".join(glif.splitlines()[1:]) glif = "\n".join(glif.splitlines()[1:])
return glif return glif

View File

@ -9,16 +9,16 @@ from ufoLib.test.testSupport import Glyph, stripText
class TestGLIF2(unittest.TestCase): class TestGLIF2(unittest.TestCase):
def assertEqual(self, first, second, msg=None): def assertEqual(self, first, second, msg=None):
if isinstance(first, basestring): if isinstance(first, str):
first = stripText(first) first = stripText(first)
if isinstance(second, basestring): if isinstance(second, str):
second = stripText(second) second = stripText(second)
return super(TestGLIF2, self).assertEqual(first, second, msg=msg) return super(TestGLIF2, self).assertEqual(first, second, msg=msg)
def pyToGLIF(self, py): def pyToGLIF(self, py):
py = stripText(py) py = stripText(py)
glyph = Glyph() glyph = Glyph()
exec py in {"glyph" : glyph, "pointPen" : glyph} exec(py, {"glyph" : glyph, "pointPen" : glyph})
glif = writeGlyphToString(glyph.name, glyphObject=glyph, drawPointsFunc=glyph.drawPoints, formatVersion=2) glif = writeGlyphToString(glyph.name, glyphObject=glyph, drawPointsFunc=glyph.drawPoints, formatVersion=2)
glif = "\n".join(glif.splitlines()[1:]) glif = "\n".join(glif.splitlines()[1:])
return glif return glif

View File

@ -7,7 +7,7 @@ import tempfile
import codecs import codecs
from plistlib import writePlist, readPlist from plistlib import writePlist, readPlist
from ufoLib import UFOReader, UFOWriter, UFOLibError from ufoLib import UFOReader, UFOWriter, UFOLibError
from testSupport import fontInfoVersion1, fontInfoVersion2 from .testSupport import fontInfoVersion1, fontInfoVersion2
class TestInfoObject(object): pass class TestInfoObject(object): pass
@ -52,7 +52,7 @@ class ReadFontInfoVersion1TestCase(unittest.TestCase):
32 : "bold", 32 : "bold",
33 : "bold italic" 33 : "bold italic"
} }
for old, new in fontStyle1To2.items(): for old, new in list(fontStyle1To2.items()):
info = dict(fontInfoVersion1) info = dict(fontInfoVersion1)
info["fontStyle"] = old info["fontStyle"] = old
self._writeInfoToPlist(info) self._writeInfoToPlist(info)
@ -73,7 +73,7 @@ class ReadFontInfoVersion1TestCase(unittest.TestCase):
"Extra-expanded" : 8, "Extra-expanded" : 8,
"Ultra-expanded" : 9 "Ultra-expanded" : 9
} }
for old, new in widthName1To2.items(): for old, new in list(widthName1To2.items()):
info = dict(fontInfoVersion1) info = dict(fontInfoVersion1)
info["widthName"] = old info["widthName"] = old
self._writeInfoToPlist(info) self._writeInfoToPlist(info)
@ -95,7 +95,7 @@ class WriteFontInfoVersion1TestCase(unittest.TestCase):
def makeInfoObject(self): def makeInfoObject(self):
infoObject = TestInfoObject() infoObject = TestInfoObject()
for attr, value in fontInfoVersion2.items(): for attr, value in list(fontInfoVersion2.items()):
setattr(infoObject, attr, value) setattr(infoObject, attr, value)
return infoObject return infoObject
@ -108,7 +108,7 @@ class WriteFontInfoVersion1TestCase(unittest.TestCase):
writer = UFOWriter(self.dstDir, formatVersion=1) writer = UFOWriter(self.dstDir, formatVersion=1)
writer.writeInfo(infoObject) writer.writeInfo(infoObject)
writtenData = self.readPlist() writtenData = self.readPlist()
for attr, originalValue in fontInfoVersion1.items(): for attr, originalValue in list(fontInfoVersion1.items()):
newValue = writtenData[attr] newValue = writtenData[attr]
self.assertEqual(newValue, originalValue) self.assertEqual(newValue, originalValue)
@ -119,7 +119,7 @@ class WriteFontInfoVersion1TestCase(unittest.TestCase):
32 : "bold", 32 : "bold",
33 : "bold italic" 33 : "bold italic"
} }
for old, new in fontStyle1To2.items(): for old, new in list(fontStyle1To2.items()):
infoObject = self.makeInfoObject() infoObject = self.makeInfoObject()
infoObject.styleMapStyleName = new infoObject.styleMapStyleName = new
writer = UFOWriter(self.dstDir, formatVersion=1) writer = UFOWriter(self.dstDir, formatVersion=1)
@ -139,7 +139,7 @@ class WriteFontInfoVersion1TestCase(unittest.TestCase):
"Extra-expanded" : 8, "Extra-expanded" : 8,
"Ultra-expanded" : 9 "Ultra-expanded" : 9
} }
for old, new in widthName1To2.items(): for old, new in list(widthName1To2.items()):
infoObject = self.makeInfoObject() infoObject = self.makeInfoObject()
infoObject.openTypeOS2WidthClass = new infoObject.openTypeOS2WidthClass = new
writer = UFOWriter(self.dstDir, formatVersion=1) writer = UFOWriter(self.dstDir, formatVersion=1)

View File

@ -7,7 +7,7 @@ import tempfile
import codecs import codecs
from plistlib import writePlist, readPlist from plistlib import writePlist, readPlist
from ufoLib import UFOReader, UFOWriter, UFOLibError from ufoLib import UFOReader, UFOWriter, UFOLibError
from testSupport import fontInfoVersion2 from .testSupport import fontInfoVersion2
class TestInfoObject(object): pass class TestInfoObject(object): pass
@ -39,7 +39,7 @@ class ReadFontInfoVersion2TestCase(unittest.TestCase):
reader = UFOReader(self.dstDir) reader = UFOReader(self.dstDir)
reader.readInfo(infoObject) reader.readInfo(infoObject)
readData = {} readData = {}
for attr in fontInfoVersion2.keys(): for attr in list(fontInfoVersion2.keys()):
readData[attr] = getattr(infoObject, attr) readData[attr] = getattr(infoObject, attr)
self.assertEqual(originalData, readData) self.assertEqual(originalData, readData)
@ -782,7 +782,7 @@ class WriteFontInfoVersion2TestCase(unittest.TestCase):
def makeInfoObject(self): def makeInfoObject(self):
infoObject = TestInfoObject() infoObject = TestInfoObject()
for attr, value in fontInfoVersion2.items(): for attr, value in list(fontInfoVersion2.items()):
setattr(infoObject, attr, value) setattr(infoObject, attr, value)
return infoObject return infoObject
@ -795,7 +795,7 @@ class WriteFontInfoVersion2TestCase(unittest.TestCase):
writer = UFOWriter(self.dstDir, formatVersion=2) writer = UFOWriter(self.dstDir, formatVersion=2)
writer.writeInfo(infoObject) writer.writeInfo(infoObject)
writtenData = self.readPlist() writtenData = self.readPlist()
for attr, originalValue in fontInfoVersion2.items(): for attr, originalValue in list(fontInfoVersion2.items()):
newValue = writtenData[attr] newValue = writtenData[attr]
self.assertEqual(newValue, originalValue) self.assertEqual(newValue, originalValue)

View File

@ -8,7 +8,7 @@ import codecs
from plistlib import writePlist, readPlist from plistlib import writePlist, readPlist
from ufoLib import UFOReader, UFOWriter, UFOLibError from ufoLib import UFOReader, UFOWriter, UFOLibError
from ufoLib.glifLib import GlifLibError from ufoLib.glifLib import GlifLibError
from testSupport import fontInfoVersion3 from .testSupport import fontInfoVersion3
class TestInfoObject(object): pass class TestInfoObject(object): pass
@ -44,7 +44,7 @@ class ReadFontInfoVersion3TestCase(unittest.TestCase):
reader = UFOReader(self.dstDir) reader = UFOReader(self.dstDir)
reader.readInfo(infoObject) reader.readInfo(infoObject)
readData = {} readData = {}
for attr in fontInfoVersion3.keys(): for attr in list(fontInfoVersion3.keys()):
readData[attr] = getattr(infoObject, attr) readData[attr] = getattr(infoObject, attr)
self.assertEqual(originalData, readData) self.assertEqual(originalData, readData)
@ -1707,7 +1707,7 @@ class WriteFontInfoVersion3TestCase(unittest.TestCase):
def makeInfoObject(self): def makeInfoObject(self):
infoObject = TestInfoObject() infoObject = TestInfoObject()
for attr, value in fontInfoVersion3.items(): for attr, value in list(fontInfoVersion3.items()):
setattr(infoObject, attr, value) setattr(infoObject, attr, value)
return infoObject return infoObject
@ -1720,7 +1720,7 @@ class WriteFontInfoVersion3TestCase(unittest.TestCase):
writer = UFOWriter(self.dstDir, formatVersion=3) writer = UFOWriter(self.dstDir, formatVersion=3)
writer.writeInfo(infoObject) writer.writeInfo(infoObject)
writtenData = self.readPlist() writtenData = self.readPlist()
for attr, originalValue in fontInfoVersion3.items(): for attr, originalValue in list(fontInfoVersion3.items()):
newValue = writtenData[attr] newValue = writtenData[attr]
self.assertEqual(newValue, originalValue) self.assertEqual(newValue, originalValue)
self.tearDownUFO() self.tearDownUFO()
@ -3341,13 +3341,13 @@ class WriteFontInfoVersion3TestCase(unittest.TestCase):
self.tearDownUFO() self.tearDownUFO()
## below min ## below min
infoObject = self.makeInfoObject() infoObject = self.makeInfoObject()
infoObject.guidelines = [dict(x=0, identifier=u"\0x1F")] infoObject.guidelines = [dict(x=0, identifier="\0x1F")]
writer = UFOWriter(self.dstDir, formatVersion=3) writer = UFOWriter(self.dstDir, formatVersion=3)
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
self.tearDownUFO() self.tearDownUFO()
## above max ## above max
infoObject = self.makeInfoObject() infoObject = self.makeInfoObject()
infoObject.guidelines = [dict(x=0, identifier=u"\0x7F")] infoObject.guidelines = [dict(x=0, identifier="\0x7F")]
writer = UFOWriter(self.dstDir, formatVersion=3) writer = UFOWriter(self.dstDir, formatVersion=3)
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
self.tearDownUFO() self.tearDownUFO()
@ -3977,7 +3977,7 @@ class UFO3WriteLayersTestCase(unittest.TestCase):
def testRenameLayer(self): def testRenameLayer(self):
self.makeUFO() self.makeUFO()
writer = UFOWriter(self.ufoPath) writer = UFOWriter(self.ufoPath)
writer.renameGlyphSet("layer 1", u"layer 3") writer.renameGlyphSet("layer 1", "layer 3")
writer.writeLayerContents(["public.default", "layer 3", "layer 2"]) writer.writeLayerContents(["public.default", "layer 3", "layer 2"])
# directories # directories
path = os.path.join(self.ufoPath, "glyphs") path = os.path.join(self.ufoPath, "glyphs")
@ -4001,8 +4001,8 @@ class UFO3WriteLayersTestCase(unittest.TestCase):
def testRenameLayerDefault(self): def testRenameLayerDefault(self):
self.makeUFO() self.makeUFO()
writer = UFOWriter(self.ufoPath) writer = UFOWriter(self.ufoPath)
writer.renameGlyphSet("public.default", u"layer xxx") writer.renameGlyphSet("public.default", "layer xxx")
writer.renameGlyphSet("layer 1", u"layer 1", defaultLayer=True) writer.renameGlyphSet("layer 1", "layer 1", defaultLayer=True)
writer.writeLayerContents(["layer xxx", "layer 1", "layer 2"]) writer.writeLayerContents(["layer xxx", "layer 1", "layer 2"])
path = os.path.join(self.ufoPath, "glyphs") path = os.path.join(self.ufoPath, "glyphs")
exists = os.path.exists(path) exists = os.path.exists(path)
@ -4027,14 +4027,14 @@ class UFO3WriteLayersTestCase(unittest.TestCase):
def testRenameLayerDuplicateName(self): def testRenameLayerDuplicateName(self):
self.makeUFO() self.makeUFO()
writer = UFOWriter(self.ufoPath) writer = UFOWriter(self.ufoPath)
self.assertRaises(UFOLibError, writer.renameGlyphSet, "layer 1", u"layer 2") self.assertRaises(UFOLibError, writer.renameGlyphSet, "layer 1", "layer 2")
# rename unknown layer # rename unknown layer
def testRenameLayerDuplicateName(self): def testRenameLayerDuplicateName(self):
self.makeUFO() self.makeUFO()
writer = UFOWriter(self.ufoPath) writer = UFOWriter(self.ufoPath)
self.assertRaises(UFOLibError, writer.renameGlyphSet, "does not exist", u"layer 2") self.assertRaises(UFOLibError, writer.renameGlyphSet, "does not exist", "layer 2")
# remove valid layer # remove valid layer
@ -4169,7 +4169,7 @@ class UFO3WriteDataTestCase(unittest.TestCase):
self.tearDownUFO() self.tearDownUFO()
# basic file with unicode text # basic file with unicode text
path = "data/org.unifiedfontobject.writebytesbasicunicodefile.txt" path = "data/org.unifiedfontobject.writebytesbasicunicodefile.txt"
bytes = u"tëßt" bytes = "tëßt"
writer = UFOWriter(self.dstDir, formatVersion=3) writer = UFOWriter(self.dstDir, formatVersion=3)
writer.writeBytesToPath(path, bytes, encoding="utf8") writer.writeBytesToPath(path, bytes, encoding="utf8")
path = os.path.join(self.dstDir, path) path = os.path.join(self.dstDir, path)

View File

@ -7,7 +7,7 @@ import tempfile
import codecs import codecs
from plistlib import writePlist, readPlist from plistlib import writePlist, readPlist
from ufoLib import convertUFOFormatVersion1ToFormatVersion2, UFOReader, UFOWriter from ufoLib import convertUFOFormatVersion1ToFormatVersion2, UFOReader, UFOWriter
from testSupport import expectedFontInfo1To2Conversion, expectedFontInfo2To1Conversion from .testSupport import expectedFontInfo1To2Conversion, expectedFontInfo2To1Conversion
# the format version 1 lib.plist contains some data # the format version 1 lib.plist contains some data

View File

@ -25,12 +25,12 @@ class GlyphSetTests(unittest.TestCase):
dstDir = self.dstDir dstDir = self.dstDir
src = GlyphSet(srcDir) src = GlyphSet(srcDir)
dst = GlyphSet(dstDir) dst = GlyphSet(dstDir)
for glyphName in src.keys(): for glyphName in list(src.keys()):
g = src[glyphName] g = src[glyphName]
g.drawPoints(None) # load attrs g.drawPoints(None) # load attrs
dst.writeGlyph(glyphName, g, g.drawPoints) dst.writeGlyph(glyphName, g, g.drawPoints)
# compare raw file data: # compare raw file data:
for glyphName in src.keys(): for glyphName in list(src.keys()):
fileName = src.contents[glyphName] fileName = src.contents[glyphName]
org = file(os.path.join(srcDir, fileName), READ_MODE).read() org = file(os.path.join(srcDir, fileName), READ_MODE).read()
new = file(os.path.join(dstDir, fileName), READ_MODE).read() new = file(os.path.join(dstDir, fileName), READ_MODE).read()
@ -45,10 +45,10 @@ class GlyphSetTests(unittest.TestCase):
def testReverseContents(self): def testReverseContents(self):
gset = GlyphSet(GLYPHSETDIR) gset = GlyphSet(GLYPHSETDIR)
d = {} d = {}
for k, v in gset.getReverseContents().items(): for k, v in list(gset.getReverseContents().items()):
d[v] = k d[v] = k
org = {} org = {}
for k, v in gset.contents.items(): for k, v in list(gset.contents.items()):
org[k] = v.lower() org[k] = v.lower()
self.assertEqual(d, org) self.assertEqual(d, org)
@ -57,7 +57,7 @@ class GlyphSetTests(unittest.TestCase):
dst = GlyphSet(self.dstDir) dst = GlyphSet(self.dstDir)
dstMap = dst.getReverseContents() dstMap = dst.getReverseContents()
self.assertEqual(dstMap, {}) self.assertEqual(dstMap, {})
for glyphName in src.keys(): for glyphName in list(src.keys()):
g = src[glyphName] g = src[glyphName]
g.drawPoints(None) # load attrs g.drawPoints(None) # load attrs
dst.writeGlyph(glyphName, g, g.drawPoints) dst.writeGlyph(glyphName, g, g.drawPoints)
@ -73,20 +73,20 @@ class GlyphSetTests(unittest.TestCase):
return "prefix" + glyphNameToFileName(glyphName, glyphSet) return "prefix" + glyphNameToFileName(glyphName, glyphSet)
src = GlyphSet(GLYPHSETDIR) src = GlyphSet(GLYPHSETDIR)
dst = GlyphSet(self.dstDir, myGlyphNameToFileName) dst = GlyphSet(self.dstDir, myGlyphNameToFileName)
for glyphName in src.keys(): for glyphName in list(src.keys()):
g = src[glyphName] g = src[glyphName]
g.drawPoints(None) # load attrs g.drawPoints(None) # load attrs
dst.writeGlyph(glyphName, g, g.drawPoints) dst.writeGlyph(glyphName, g, g.drawPoints)
d = {} d = {}
for k, v in src.contents.items(): for k, v in list(src.contents.items()):
print k, v print(k, v)
d[k] = "prefix" + v d[k] = "prefix" + v
self.assertEqual(d, dst.contents) self.assertEqual(d, dst.contents)
def testGetUnicodes(self): def testGetUnicodes(self):
src = GlyphSet(GLYPHSETDIR) src = GlyphSet(GLYPHSETDIR)
unicodes = src.getUnicodes() unicodes = src.getUnicodes()
for glyphName in src.keys(): for glyphName in list(src.keys()):
g = src[glyphName] g = src[glyphName]
g.drawPoints(None) # load attrs g.drawPoints(None) # load attrs
if not hasattr(g, "unicodes"): if not hasattr(g, "unicodes"):

View File

@ -69,17 +69,17 @@ def genericDictValidator(value, prototype):
if not isinstance(value, dict): if not isinstance(value, dict):
return False return False
# missing required keys # missing required keys
for key, (typ, required) in prototype.items(): for key, (typ, required) in list(prototype.items()):
if not required: if not required:
continue continue
if key not in value: if key not in value:
return False return False
# unknown keys # unknown keys
for key in value.keys(): for key in list(value.keys()):
if key not in prototype: if key not in prototype:
return False return False
# incorrect types # incorrect types
for key, v in value.items(): for key, v in list(value.items()):
prototypeType, required = prototype[key] prototypeType, required = prototype[key]
if v is None and not required: if v is None and not required:
continue continue
@ -132,7 +132,7 @@ def fontInfoOpenTypeHeadCreatedValidator(value):
Version 2+. Version 2+.
""" """
# format: 0000/00/00 00:00:00 # format: 0000/00/00 00:00:00
if not isinstance(value, basestring): if not isinstance(value, str):
return False return False
# basic formatting # basic formatting
if not len(value) == 19: if not len(value) == 19:
@ -192,7 +192,7 @@ def fontInfoOpenTypeNameRecordsValidator(value):
""" """
if not isinstance(value, list): if not isinstance(value, list):
return False return False
dictPrototype = dict(nameID=(int, True), platformID=(int, True), encodingID=(int, True), languageID=(int, True), string=(basestring, True)) dictPrototype = dict(nameID=(int, True), platformID=(int, True), encodingID=(int, True), languageID=(int, True), string=(str, True))
for nameRecord in value: for nameRecord in value:
if not genericDictValidator(nameRecord, dictPrototype): if not genericDictValidator(nameRecord, dictPrototype):
return False return False
@ -315,7 +315,7 @@ def fontInfoPostscriptWindowsCharacterSetValidator(value):
""" """
Version 2+. Version 2+.
""" """
validValues = range(1, 21) validValues = list(range(1, 21))
if value not in validValues: if value not in validValues:
return False return False
return True return True
@ -324,7 +324,7 @@ def fontInfoWOFFMetadataUniqueIDValidator(value):
""" """
Version 3+. Version 3+.
""" """
dictPrototype = dict(id=(basestring, True)) dictPrototype = dict(id=(str, True))
if not genericDictValidator(value, dictPrototype): if not genericDictValidator(value, dictPrototype):
return False return False
return True return True
@ -333,7 +333,7 @@ def fontInfoWOFFMetadataVendorValidator(value):
""" """
Version 3+. Version 3+.
""" """
dictPrototype = {"name" : (basestring, True), "url" : (basestring, False), "dir" : (basestring, False), "class" : (basestring, False)} dictPrototype = {"name" : (str, True), "url" : (str, False), "dir" : (str, False), "class" : (str, False)}
if not genericDictValidator(value, dictPrototype): if not genericDictValidator(value, dictPrototype):
return False return False
if "dir" in value and value.get("dir") not in ("ltr", "rtl"): if "dir" in value and value.get("dir") not in ("ltr", "rtl"):
@ -349,7 +349,7 @@ def fontInfoWOFFMetadataCreditsValidator(value):
return False return False
if not len(value["credits"]): if not len(value["credits"]):
return False return False
dictPrototype = {"name" : (basestring, True), "url" : (basestring, False), "role" : (basestring, False), "dir" : (basestring, False), "class" : (basestring, False)} dictPrototype = {"name" : (str, True), "url" : (str, False), "role" : (str, False), "dir" : (str, False), "class" : (str, False)}
for credit in value["credits"]: for credit in value["credits"]:
if not genericDictValidator(credit, dictPrototype): if not genericDictValidator(credit, dictPrototype):
return False return False
@ -361,7 +361,7 @@ def fontInfoWOFFMetadataDescriptionValidator(value):
""" """
Version 3+. Version 3+.
""" """
dictPrototype = dict(url=(basestring, False), text=(list, True)) dictPrototype = dict(url=(str, False), text=(list, True))
if not genericDictValidator(value, dictPrototype): if not genericDictValidator(value, dictPrototype):
return False return False
for text in value["text"]: for text in value["text"]:
@ -373,7 +373,7 @@ def fontInfoWOFFMetadataLicenseValidator(value):
""" """
Version 3+. Version 3+.
""" """
dictPrototype = dict(url=(basestring, False), text=(list, False), id=(basestring, False)) dictPrototype = dict(url=(str, False), text=(list, False), id=(str, False))
if not genericDictValidator(value, dictPrototype): if not genericDictValidator(value, dictPrototype):
return False return False
if "text" in value: if "text" in value:
@ -410,7 +410,7 @@ def fontInfoWOFFMetadataLicenseeValidator(value):
""" """
Version 3+. Version 3+.
""" """
dictPrototype = {"name" : (basestring, True), "dir" : (basestring, False), "class" : (basestring, False)} dictPrototype = {"name" : (str, True), "dir" : (str, False), "class" : (str, False)}
if not genericDictValidator(value, dictPrototype): if not genericDictValidator(value, dictPrototype):
return False return False
if "dir" in value and value.get("dir") not in ("ltr", "rtl"): if "dir" in value and value.get("dir") not in ("ltr", "rtl"):
@ -421,7 +421,7 @@ def fontInfoWOFFMetadataTextValue(value):
""" """
Version 3+. Version 3+.
""" """
dictPrototype = {"text" : (basestring, True), "language" : (basestring, False), "dir" : (basestring, False), "class" : (basestring, False)} dictPrototype = {"text" : (str, True), "language" : (str, False), "dir" : (str, False), "class" : (str, False)}
if not genericDictValidator(value, dictPrototype): if not genericDictValidator(value, dictPrototype):
return False return False
if "dir" in value and value.get("dir") not in ("ltr", "rtl"): if "dir" in value and value.get("dir") not in ("ltr", "rtl"):
@ -445,7 +445,7 @@ def fontInfoWOFFMetadataExtensionValidator(value):
""" """
Version 3+. Version 3+.
""" """
dictPrototype = dict(names=(list, False), items=(list, True), id=(basestring, False)) dictPrototype = dict(names=(list, False), items=(list, True), id=(str, False))
if not genericDictValidator(value, dictPrototype): if not genericDictValidator(value, dictPrototype):
return False return False
if "names" in value: if "names" in value:
@ -461,7 +461,7 @@ def fontInfoWOFFMetadataExtensionItemValidator(value):
""" """
Version 3+. Version 3+.
""" """
dictPrototype = dict(id=(basestring, False), names=(list, True), values=(list, True)) dictPrototype = dict(id=(str, False), names=(list, True), values=(list, True))
if not genericDictValidator(value, dictPrototype): if not genericDictValidator(value, dictPrototype):
return False return False
for name in value["names"]: for name in value["names"]:
@ -476,7 +476,7 @@ def fontInfoWOFFMetadataExtensionNameValidator(value):
""" """
Version 3+. Version 3+.
""" """
dictPrototype = {"text" : (basestring, True), "language" : (basestring, False), "dir" : (basestring, False), "class" : (basestring, False)} dictPrototype = {"text" : (str, True), "language" : (str, False), "dir" : (str, False), "class" : (str, False)}
if not genericDictValidator(value, dictPrototype): if not genericDictValidator(value, dictPrototype):
return False return False
if "dir" in value and value.get("dir") not in ("ltr", "rtl"): if "dir" in value and value.get("dir") not in ("ltr", "rtl"):
@ -487,7 +487,7 @@ def fontInfoWOFFMetadataExtensionValueValidator(value):
""" """
Version 3+. Version 3+.
""" """
dictPrototype = {"text" : (basestring, True), "language" : (basestring, False), "dir" : (basestring, False), "class" : (basestring, False)} dictPrototype = {"text" : (str, True), "language" : (str, False), "dir" : (str, False), "class" : (str, False)}
if not genericDictValidator(value, dictPrototype): if not genericDictValidator(value, dictPrototype):
return False return False
if "dir" in value and value.get("dir") not in ("ltr", "rtl"): if "dir" in value and value.get("dir") not in ("ltr", "rtl"):
@ -522,7 +522,7 @@ def guidelineValidator(value):
""" """
dictPrototype = dict( dictPrototype = dict(
x=((int, float), False), y=((int, float), False), angle=((int, float), False), x=((int, float), False), y=((int, float), False), angle=((int, float), False),
name=(basestring, False), color=(basestring, False), identifier=(basestring, False) name=(str, False), color=(str, False), identifier=(str, False)
) )
if not genericDictValidator(value, dictPrototype): if not genericDictValidator(value, dictPrototype):
return False return False
@ -583,7 +583,7 @@ def anchorValidator(value):
""" """
dictPrototype = dict( dictPrototype = dict(
x=((int, float), False), y=((int, float), False), x=((int, float), False), y=((int, float), False),
name=(basestring, False), color=(basestring, False), identifier=(basestring, False) name=(str, False), color=(str, False), identifier=(str, False)
) )
if not genericDictValidator(value, dictPrototype): if not genericDictValidator(value, dictPrototype):
return False return False
@ -619,7 +619,7 @@ def identifierValidator(value):
""" """
validCharactersMin = 0x20 validCharactersMin = 0x20
validCharactersMax = 0x7E validCharactersMax = 0x7E
if not isinstance(value, basestring): if not isinstance(value, str):
return False return False
if not value: if not value:
return False return False
@ -678,7 +678,7 @@ def colorValidator(value):
>>> colorValidator("1, 1, 1, 1") >>> colorValidator("1, 1, 1, 1")
True True
""" """
if not isinstance(value, basestring): if not isinstance(value, str):
return False return False
parts = value.split(",") parts = value.split(",")
if len(parts) != 4: if len(parts) != 4:
@ -714,10 +714,10 @@ def imageValidator(value):
Version 3+. Version 3+.
""" """
dictPrototype = dict( dictPrototype = dict(
fileName=(basestring, True), fileName=(str, True),
xScale=((int, float), False), xyScale=((int, float), False), yxScale=((int, float), False), yScale=((int, float), False), xScale=((int, float), False), xyScale=((int, float), False), yxScale=((int, float), False), yScale=((int, float), False),
xOffset=((int, float), False), yOffset=((int, float), False), xOffset=((int, float), False), yOffset=((int, float), False),
color=(basestring, False) color=(str, False)
) )
if not genericDictValidator(value, dictPrototype): if not genericDictValidator(value, dictPrototype):
return False return False
@ -775,7 +775,7 @@ def layerContentsValidator(value, ufoPath):
if not len(entry) == 2: if not len(entry) == 2:
return False, bogusFileMessage return False, bogusFileMessage
for i in entry: for i in entry:
if not isinstance(i, basestring): if not isinstance(i, str):
return False, bogusFileMessage return False, bogusFileMessage
layerName, directoryName = entry layerName, directoryName = entry
# check directory naming # check directory naming
@ -801,7 +801,7 @@ def layerContentsValidator(value, ufoPath):
# store # store
contents[layerName] = directoryName contents[layerName] = directoryName
# missing default layer # missing default layer
foundDefault = "glyphs" in contents.values() foundDefault = "glyphs" in list(contents.values())
if not foundDefault: if not foundDefault:
return False, "The required default glyph set is not in the UFO." return False, "The required default glyph set is not in the UFO."
return True, None return True, None
@ -847,8 +847,8 @@ def groupsValidator(value):
return False, bogusFormatMessage return False, bogusFormatMessage
firstSideMapping = {} firstSideMapping = {}
secondSideMapping = {} secondSideMapping = {}
for groupName, glyphList in value.items(): for groupName, glyphList in list(value.items()):
if not isinstance(groupName, basestring): if not isinstance(groupName, str):
return False, bogusFormatMessage return False, bogusFormatMessage
if not isinstance(glyphList, (list, tuple)): if not isinstance(glyphList, (list, tuple)):
return False, bogusFormatMessage return False, bogusFormatMessage
@ -866,7 +866,7 @@ def groupsValidator(value):
else: else:
d = secondSideMapping d = secondSideMapping
for glyphName in glyphList: for glyphName in glyphList:
if not isinstance(glyphName, basestring): if not isinstance(glyphName, str):
return False, "The group data %s contains an invalid member." % groupName return False, "The group data %s contains an invalid member." % groupName
if glyphName in d: if glyphName in d:
return False, "The glyph \"%s\" occurs in too many kerning groups." % glyphName return False, "The glyph \"%s\" occurs in too many kerning groups." % glyphName
@ -907,7 +907,7 @@ def kerningValidatorReportPairs(kerning, groups):
# flatten the groups # flatten the groups
flatFirstGroups = {} flatFirstGroups = {}
flatSecondGroups = {} flatSecondGroups = {}
for groupName, glyphList in groups.items(): for groupName, glyphList in list(groups.items()):
if not groupName.startswith("public.kern1.") and not groupName.startswith("public.kern2."): if not groupName.startswith("public.kern1.") and not groupName.startswith("public.kern2."):
continue continue
if groupName.startswith("public.kern1."): if groupName.startswith("public.kern1."):
@ -1004,8 +1004,8 @@ def fontLibValidator(value):
bogusFormatMessage = "The lib data is not in the correct format." bogusFormatMessage = "The lib data is not in the correct format."
if not isDictEnough(value): if not isDictEnough(value):
return False, bogusFormatMessage return False, bogusFormatMessage
for key, value in value.items(): for key, value in list(value.items()):
if not isinstance(key, basestring): if not isinstance(key, str):
return False, bogusFormatMessage return False, bogusFormatMessage
# public.glyphOrder # public.glyphOrder
if key == "public.glyphOrder": if key == "public.glyphOrder":
@ -1013,7 +1013,7 @@ def fontLibValidator(value):
if not isinstance(value, (list, tuple)): if not isinstance(value, (list, tuple)):
return False, bogusGlyphOrderMessage return False, bogusGlyphOrderMessage
for glyphName in value: for glyphName in value:
if not isinstance(glyphName, basestring): if not isinstance(glyphName, str):
return False, bogusGlyphOrderMessage return False, bogusGlyphOrderMessage
return True, None return True, None
@ -1045,8 +1045,8 @@ def glyphLibValidator(value):
bogusFormatMessage = "The lib data is not in the correct format." bogusFormatMessage = "The lib data is not in the correct format."
if not isDictEnough(value): if not isDictEnough(value):
return False, bogusFormatMessage return False, bogusFormatMessage
for key, value in value.items(): for key, value in list(value.items()):
if not isinstance(key, basestring): if not isinstance(key, str):
return False, bogusFormatMessage return False, bogusFormatMessage
# public.markColor # public.markColor
if key == "public.markColor": if key == "public.markColor":

View File

@ -40,7 +40,7 @@ class XMLParser:
parser.StartElementHandler = self.startElementHandler parser.StartElementHandler = self.startElementHandler
parser.EndElementHandler = self.endElementHandler parser.EndElementHandler = self.endElementHandler
parser.CharacterDataHandler = self.characterDataHandler parser.CharacterDataHandler = self.characterDataHandler
if isinstance(pathOrFile, (str, unicode)): if isinstance(pathOrFile, str):
f = open(pathOrFile) f = open(pathOrFile)
didOpen = 1 didOpen = 1
else: else:
@ -59,7 +59,7 @@ class XMLParser:
proc.app.handle_start_tag = self.startElementHandler proc.app.handle_start_tag = self.startElementHandler
proc.app.handle_end_tag = self.endElementHandler proc.app.handle_end_tag = self.endElementHandler
proc.app.handle_data = self._xmlprocDataHandler proc.app.handle_data = self._xmlprocDataHandler
if isinstance(pathOrFile, (str, unicode)): if isinstance(pathOrFile, str):
f = open(pathOrFile) f = open(pathOrFile)
didOpen = 1 didOpen = 1
else: else: