From 0f5b6e2e83c3b5f745d0ceb8760b2b5fde9141aa Mon Sep 17 00:00:00 2001 From: Nikolaus Waxweiler Date: Mon, 9 Sep 2019 22:24:59 +0100 Subject: [PATCH] Reduce use of py23 --- Lib/fontTools/ufoLib/__init__.py | 92 +++++++++++++++--------------- Lib/fontTools/ufoLib/filenames.py | 8 +-- Lib/fontTools/ufoLib/glifLib.py | 26 ++++----- Lib/fontTools/ufoLib/plistlib.py | 4 +- Lib/fontTools/ufoLib/validators.py | 71 +++++++++++------------ Tests/ufoLib/GLIF1_test.py | 8 +-- Tests/ufoLib/GLIF2_test.py | 8 +-- Tests/ufoLib/UFO3_test.py | 3 +- Tests/ufoLib/testSupport.py | 10 +--- 9 files changed, 105 insertions(+), 125 deletions(-) diff --git a/Lib/fontTools/ufoLib/__init__.py b/Lib/fontTools/ufoLib/__init__.py index c220aefe2..44f562f52 100755 --- a/Lib/fontTools/ufoLib/__init__.py +++ b/Lib/fontTools/ufoLib/__init__.py @@ -15,7 +15,7 @@ import fs.osfs import fs.zipfs import fs.tempfs import fs.tools -from fontTools.misc.py23 import basestring, unicode, tounicode +from fontTools.misc.py23 import tostr from fontTools.misc import plistlib from fontTools.ufoLib.validators import * from fontTools.ufoLib.filenames import userNameToFileName @@ -205,7 +205,7 @@ class UFOReader(_UFOBaseIO): if hasattr(path, "__fspath__"): # support os.PathLike objects path = path.__fspath__() - if isinstance(path, basestring): + if isinstance(path, str): structure = _sniffFileStructure(path) try: if structure is UFOFileStructure.ZIP: @@ -252,7 +252,7 @@ class UFOReader(_UFOBaseIO): path = filesystem.getsyspath("/") except fs.errors.NoSysPath: # network or in-memory FS may not map to the local one - path = unicode(filesystem) + path = str(filesystem) # when user passed an already initialized fs instance, it is her # responsibility to close it, thus UFOReader.close/__exit__ are no-op self._shouldClose = False @@ -324,12 +324,12 @@ class UFOReader(_UFOBaseIO): if not isinstance(groups, dict): raise UFOLibError(invalidFormatMessage) for groupName, glyphList in groups.items(): - if not isinstance(groupName, basestring): + if not isinstance(groupName, str): raise UFOLibError(invalidFormatMessage) elif not isinstance(glyphList, list): raise UFOLibError(invalidFormatMessage) for glyphName in glyphList: - if not isinstance(glyphName, basestring): + if not isinstance(glyphName, str): raise UFOLibError(invalidFormatMessage) self._upConvertedKerningData = dict( kerning={}, @@ -366,7 +366,7 @@ class UFOReader(_UFOBaseIO): The path must be relative to the UFO path. Returns None if the file does not exist. By default the file is opened in binary mode (reads bytes). - If encoding is passed, the file is opened in text mode (reads unicode). + If encoding is passed, the file is opened in text mode (reads str). Note: The caller is responsible for closing the open file. """ @@ -572,7 +572,7 @@ class UFOReader(_UFOBaseIO): def readFeatures(self): """ - Read features.fea. Return a unicode string. + Read features.fea. Return a string. The returned string is empty if the file is missing. """ try: @@ -672,7 +672,7 @@ class UFOReader(_UFOBaseIO): def getCharacterMapping(self, layerName=None, validate=None): """ - Return a dictionary that maps unicode values (ints) to + Return a dictionary that maps str values (ints) to lists of glyph names. """ if validate is None: @@ -829,7 +829,7 @@ class UFOWriter(UFOReader): if hasattr(path, "__fspath__"): # support os.PathLike objects path = path.__fspath__() - if isinstance(path, basestring): + if isinstance(path, str): # normalize path by removing trailing or double slashes path = os.path.normpath(path) havePreviousFile = os.path.exists(path) @@ -909,7 +909,7 @@ class UFOWriter(UFOReader): path = filesystem.getsyspath("/") except fs.errors.NoSysPath: # network or in-memory FS may not map to the local one - path = unicode(filesystem) + path = str(filesystem) # if passed an FS object, always use 'package' structure if structure and structure is not UFOFileStructure.PACKAGE: import warnings @@ -1241,9 +1241,9 @@ class UFOWriter(UFOReader): raise UFOLibError(invalidFormatMessage) if not len(pair) == 2: raise UFOLibError(invalidFormatMessage) - if not isinstance(pair[0], basestring): + if not isinstance(pair[0], str): raise UFOLibError(invalidFormatMessage) - if not isinstance(pair[1], basestring): + if not isinstance(pair[1], str): raise UFOLibError(invalidFormatMessage) if not isinstance(value, numberTypes): raise UFOLibError(invalidFormatMessage) @@ -1301,7 +1301,7 @@ class UFOWriter(UFOReader): if self._formatVersion == 1: raise UFOLibError("features.fea is not allowed in UFO Format Version 1.") if validate: - if not isinstance(features, basestring): + if not isinstance(features, str): raise UFOLibError("The features are not text.") if features: self.writeBytesToPath(FEATURES_FILENAME, features.encode("utf8")) @@ -1325,7 +1325,7 @@ class UFOWriter(UFOReader): if layerName is None: layerName = DEFAULT_LAYER_NAME else: - layerName = tounicode(layerName) + layerName = tostr(layerName) newOrder.append(layerName) layerOrder = newOrder else: @@ -1439,9 +1439,9 @@ class UFOWriter(UFOReader): # not caching this could be slightly expensive, # but caching it will be cumbersome existing = {d.lower() for d in self.layerContents.values()} - if not isinstance(layerName, unicode): + if not isinstance(layerName, str): try: - layerName = unicode(layerName) + layerName = str(layerName) except UnicodeDecodeError: raise UFOLibError("The specified layer name is not a Unicode string.") directory = userNameToFileName(layerName, existing=existing, prefix="glyphs.") @@ -1587,7 +1587,7 @@ UFOReaderWriter = UFOWriter def _sniffFileStructure(ufo_path): - """Return UFOFileStructure.ZIP if the UFO at path 'ufo_path' (basestring) + """Return UFOFileStructure.ZIP if the UFO at path 'ufo_path' (str) is a zip file, else return UFOFileStructure.PACKAGE if 'ufo_path' is a directory. Raise UFOLibError if it is a file with unknown structure, or if the path @@ -1775,23 +1775,23 @@ fontInfoAttributesVersion1 = { } fontInfoAttributesVersion2ValueData = { - "familyName" : dict(type=basestring), - "styleName" : dict(type=basestring), - "styleMapFamilyName" : dict(type=basestring), - "styleMapStyleName" : dict(type=basestring, valueValidator=fontInfoStyleMapStyleNameValidator), + "familyName" : dict(type=str), + "styleName" : dict(type=str), + "styleMapFamilyName" : dict(type=str), + "styleMapStyleName" : dict(type=str, valueValidator=fontInfoStyleMapStyleNameValidator), "versionMajor" : dict(type=int), "versionMinor" : dict(type=int), "year" : dict(type=int), - "copyright" : dict(type=basestring), - "trademark" : dict(type=basestring), + "copyright" : dict(type=str), + "trademark" : dict(type=str), "unitsPerEm" : dict(type=(int, float)), "descender" : dict(type=(int, float)), "xHeight" : dict(type=(int, float)), "capHeight" : dict(type=(int, float)), "ascender" : dict(type=(int, float)), "italicAngle" : dict(type=(float, int)), - "note" : dict(type=basestring), - "openTypeHeadCreated" : dict(type=basestring, valueValidator=fontInfoOpenTypeHeadCreatedValidator), + "note" : dict(type=str), + "openTypeHeadCreated" : dict(type=str, valueValidator=fontInfoOpenTypeHeadCreatedValidator), "openTypeHeadLowestRecPPEM" : dict(type=(int, float)), "openTypeHeadFlags" : dict(type="integerList", valueValidator=genericIntListValidator, valueOptions=fontInfoOpenTypeHeadFlagsOptions), "openTypeHheaAscender" : dict(type=(int, float)), @@ -1800,25 +1800,25 @@ fontInfoAttributesVersion2ValueData = { "openTypeHheaCaretSlopeRise" : dict(type=int), "openTypeHheaCaretSlopeRun" : dict(type=int), "openTypeHheaCaretOffset" : dict(type=(int, float)), - "openTypeNameDesigner" : dict(type=basestring), - "openTypeNameDesignerURL" : dict(type=basestring), - "openTypeNameManufacturer" : dict(type=basestring), - "openTypeNameManufacturerURL" : dict(type=basestring), - "openTypeNameLicense" : dict(type=basestring), - "openTypeNameLicenseURL" : dict(type=basestring), - "openTypeNameVersion" : dict(type=basestring), - "openTypeNameUniqueID" : dict(type=basestring), - "openTypeNameDescription" : dict(type=basestring), - "openTypeNamePreferredFamilyName" : dict(type=basestring), - "openTypeNamePreferredSubfamilyName" : dict(type=basestring), - "openTypeNameCompatibleFullName" : dict(type=basestring), - "openTypeNameSampleText" : dict(type=basestring), - "openTypeNameWWSFamilyName" : dict(type=basestring), - "openTypeNameWWSSubfamilyName" : dict(type=basestring), + "openTypeNameDesigner" : dict(type=str), + "openTypeNameDesignerURL" : dict(type=str), + "openTypeNameManufacturer" : dict(type=str), + "openTypeNameManufacturerURL" : dict(type=str), + "openTypeNameLicense" : dict(type=str), + "openTypeNameLicenseURL" : dict(type=str), + "openTypeNameVersion" : dict(type=str), + "openTypeNameUniqueID" : dict(type=str), + "openTypeNameDescription" : dict(type=str), + "openTypeNamePreferredFamilyName" : dict(type=str), + "openTypeNamePreferredSubfamilyName" : dict(type=str), + "openTypeNameCompatibleFullName" : dict(type=str), + "openTypeNameSampleText" : dict(type=str), + "openTypeNameWWSFamilyName" : dict(type=str), + "openTypeNameWWSSubfamilyName" : dict(type=str), "openTypeOS2WidthClass" : dict(type=int, valueValidator=fontInfoOpenTypeOS2WidthClassValidator), "openTypeOS2WeightClass" : dict(type=int, valueValidator=fontInfoOpenTypeOS2WeightClassValidator), "openTypeOS2Selection" : dict(type="integerList", valueValidator=genericIntListValidator, valueOptions=fontInfoOpenTypeOS2SelectionOptions), - "openTypeOS2VendorID" : dict(type=basestring), + "openTypeOS2VendorID" : dict(type=str), "openTypeOS2Panose" : dict(type="integerList", valueValidator=fontInfoVersion2OpenTypeOS2PanoseValidator), "openTypeOS2FamilyClass" : dict(type="integerList", valueValidator=fontInfoOpenTypeOS2FamilyClassValidator), "openTypeOS2UnicodeRanges" : dict(type="integerList", valueValidator=genericIntListValidator, valueOptions=fontInfoOpenTypeOS2UnicodeRangesOptions), @@ -1845,8 +1845,8 @@ fontInfoAttributesVersion2ValueData = { "openTypeVheaCaretSlopeRise" : dict(type=int), "openTypeVheaCaretSlopeRun" : dict(type=int), "openTypeVheaCaretOffset" : dict(type=(int, float)), - "postscriptFontName" : dict(type=basestring), - "postscriptFullName" : dict(type=basestring), + "postscriptFontName" : dict(type=str), + "postscriptFullName" : dict(type=str), "postscriptSlantAngle" : dict(type=(float, int)), "postscriptUniqueID" : dict(type=int), "postscriptUnderlineThickness" : dict(type=(int, float)), @@ -1864,11 +1864,11 @@ fontInfoAttributesVersion2ValueData = { "postscriptForceBold" : dict(type=bool), "postscriptDefaultWidthX" : dict(type=(int, float)), "postscriptNominalWidthX" : dict(type=(int, float)), - "postscriptWeightName" : dict(type=basestring), - "postscriptDefaultCharacter" : dict(type=basestring), + "postscriptWeightName" : dict(type=str), + "postscriptDefaultCharacter" : dict(type=str), "postscriptWindowsCharacterSet" : dict(type=int, valueValidator=fontInfoPostscriptWindowsCharacterSetValidator), "macintoshFONDFamilyID" : dict(type=int), - "macintoshFONDName" : dict(type=basestring), + "macintoshFONDName" : dict(type=str), } fontInfoAttributesVersion2 = set(fontInfoAttributesVersion2ValueData.keys()) diff --git a/Lib/fontTools/ufoLib/filenames.py b/Lib/fontTools/ufoLib/filenames.py index a00131d0f..cc356c93e 100644 --- a/Lib/fontTools/ufoLib/filenames.py +++ b/Lib/fontTools/ufoLib/filenames.py @@ -2,8 +2,6 @@ User name to file name conversion. This was taken form the UFO 3 spec. """ -from fontTools.misc.py23 import basestring, unicode - illegalCharacters = r"\" * + / : < > ? [ \ ] | \0".split(" ") illegalCharacters += [chr(i) for i in range(1, 32)] @@ -67,9 +65,9 @@ def userNameToFileName(userName, existing=[], prefix="", suffix=""): >>> userNameToFileName("alt.con") == "alt._con" True """ - # the incoming name must be a unicode string - if not isinstance(userName, unicode): - raise ValueError("The value for userName must be a unicode string.") + # the incoming name must be a string + if not isinstance(userName, str): + raise ValueError("The value for userName must be a string.") # establish the prefix and suffix lengths prefixLength = len(prefix) suffixLength = len(suffix) diff --git a/Lib/fontTools/ufoLib/glifLib.py b/Lib/fontTools/ufoLib/glifLib.py index 7287697c0..3c48a664c 100755 --- a/Lib/fontTools/ufoLib/glifLib.py +++ b/Lib/fontTools/ufoLib/glifLib.py @@ -17,7 +17,7 @@ import fs.base import fs.errors import fs.osfs import fs.path -from fontTools.misc.py23 import basestring, unicode, tobytes, tounicode +from fontTools.misc.py23 import tobytes, tostr from fontTools.misc import plistlib from fontTools.pens.pointPen import AbstractPointPen, PointToSegmentPen from fontTools.ufoLib.errors import GlifLibError @@ -127,7 +127,7 @@ class GlyphSet(_UFOBaseIO): """ if ufoFormatVersion not in supportedUFOFormatVersions: raise GlifLibError("Unsupported UFO format version: %s" % ufoFormatVersion) - if isinstance(path, basestring): + if isinstance(path, str): try: filesystem = fs.osfs.OSFS(path) except fs.errors.CreateFailed: @@ -149,7 +149,7 @@ class GlyphSet(_UFOBaseIO): path = filesystem.getsyspath("/") except fs.errors.NoSysPath: # network or in-memory FS may not map to the local one - path = unicode(filesystem) + path = str(filesystem) # 'dirName' is kept for backward compatibility only, but it's DEPRECATED # as it's not guaranteed that it maps to an existing OSFS directory. # Client could use the FS api via the `self.fs` attribute instead. @@ -185,9 +185,9 @@ class GlyphSet(_UFOBaseIO): invalidFormat = True else: for name, fileName in contents.items(): - if not isinstance(name, basestring): + if not isinstance(name, str): invalidFormat = True - if not isinstance(fileName, basestring): + if not isinstance(fileName, str): invalidFormat = True elif not self.fs.exists(fileName): raise GlifLibError( @@ -521,9 +521,9 @@ def glyphNameToFileName(glyphName, existingFileNames): """ if existingFileNames is None: existingFileNames = [] - if not isinstance(glyphName, unicode): + if not isinstance(glyphName, str): try: - new = unicode(glyphName) + new = str(glyphName) glyphName = new except UnicodeDecodeError: pass @@ -576,7 +576,7 @@ def _writeGlyphToBytes( formatVersion=2, validate=True): """Return .glif data for a glyph as a UTF-8 encoded bytes string.""" # start - if validate and not isinstance(glyphName, basestring): + if validate and not isinstance(glyphName, str): raise GlifLibError("The glyph name is not properly formatted.") if validate and len(glyphName) == 0: raise GlifLibError("The glyph name is empty.") @@ -695,12 +695,12 @@ def _writeUnicodes(glyphObject, element, validate): def _writeNote(glyphObject, element, validate): note = getattr(glyphObject, "note", None) - if validate and not isinstance(note, basestring): - raise GlifLibError("note attribute must be str or unicode") + if validate and not isinstance(note, str): + raise GlifLibError("note attribute must be str") note = note.strip() note = "\n" + note + "\n" - # ensure text is unicode, if it's bytes decode as ASCII - etree.SubElement(element, "note").text = tounicode(note) + # ensure text is str, if it's bytes decode as ASCII + etree.SubElement(element, "note").text = note def _writeImage(glyphObject, element, validate): image = getattr(glyphObject, "image", None) @@ -805,7 +805,7 @@ def _writeLib(glyphObject, element, validate): # ----------------------- layerInfoVersion3ValueData = { - "color" : dict(type=basestring, valueValidator=colorValidator), + "color" : dict(type=str, valueValidator=colorValidator), "lib" : dict(type=dict, valueValidator=genericTypeValidator) } diff --git a/Lib/fontTools/ufoLib/plistlib.py b/Lib/fontTools/ufoLib/plistlib.py index d0247bf94..a1d5fbb1d 100644 --- a/Lib/fontTools/ufoLib/plistlib.py +++ b/Lib/fontTools/ufoLib/plistlib.py @@ -12,7 +12,7 @@ from fontTools.ufoLib.utils import deprecated @deprecated("Use 'fontTools.misc.plistlib.load' instead") def readPlist(path_or_file): did_open = False - if isinstance(path_or_file, basestring): + if isinstance(path_or_file, str): path_or_file = open(path_or_file, "rb") did_open = True try: @@ -25,7 +25,7 @@ def readPlist(path_or_file): @deprecated("Use 'fontTools.misc.plistlib.dump' instead") def writePlist(value, path_or_file): did_open = False - if isinstance(path_or_file, basestring): + if isinstance(path_or_file, str): path_or_file = open(path_or_file, "wb") did_open = True try: diff --git a/Lib/fontTools/ufoLib/validators.py b/Lib/fontTools/ufoLib/validators.py index 8961ebd14..1635b58cd 100644 --- a/Lib/fontTools/ufoLib/validators.py +++ b/Lib/fontTools/ufoLib/validators.py @@ -5,12 +5,7 @@ from io import open import fs.base import fs.osfs -try: - from collections.abc import Mapping # python >= 3.3 -except ImportError: - from collections import Mapping - -from fontTools.misc.py23 import basestring +from collections.abc import Mapping from fontTools.ufoLib.utils import integerTypes, numberTypes @@ -142,7 +137,7 @@ def fontInfoOpenTypeHeadCreatedValidator(value): Version 2+. """ # format: 0000/00/00 00:00:00 - if not isinstance(value, basestring): + if not isinstance(value, str): return False # basic formatting if not len(value) == 19: @@ -202,7 +197,7 @@ def fontInfoOpenTypeNameRecordsValidator(value): """ if not isinstance(value, list): 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: if not genericDictValidator(nameRecord, dictPrototype): return False @@ -334,7 +329,7 @@ def fontInfoWOFFMetadataUniqueIDValidator(value): """ Version 3+. """ - dictPrototype = dict(id=(basestring, True)) + dictPrototype = dict(id=(str, True)) if not genericDictValidator(value, dictPrototype): return False return True @@ -343,7 +338,7 @@ def fontInfoWOFFMetadataVendorValidator(value): """ 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): return False if "dir" in value and value.get("dir") not in ("ltr", "rtl"): @@ -359,7 +354,7 @@ def fontInfoWOFFMetadataCreditsValidator(value): return False if not len(value["credits"]): 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"]: if not genericDictValidator(credit, dictPrototype): return False @@ -371,7 +366,7 @@ def fontInfoWOFFMetadataDescriptionValidator(value): """ Version 3+. """ - dictPrototype = dict(url=(basestring, False), text=(list, True)) + dictPrototype = dict(url=(str, False), text=(list, True)) if not genericDictValidator(value, dictPrototype): return False for text in value["text"]: @@ -383,7 +378,7 @@ def fontInfoWOFFMetadataLicenseValidator(value): """ 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): return False if "text" in value: @@ -420,7 +415,7 @@ def fontInfoWOFFMetadataLicenseeValidator(value): """ 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): return False if "dir" in value and value.get("dir") not in ("ltr", "rtl"): @@ -431,7 +426,7 @@ def fontInfoWOFFMetadataTextValue(value): """ 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): return False if "dir" in value and value.get("dir") not in ("ltr", "rtl"): @@ -455,7 +450,7 @@ def fontInfoWOFFMetadataExtensionValidator(value): """ 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): return False if "names" in value: @@ -471,7 +466,7 @@ def fontInfoWOFFMetadataExtensionItemValidator(value): """ 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): return False for name in value["names"]: @@ -486,7 +481,7 @@ def fontInfoWOFFMetadataExtensionNameValidator(value): """ 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): return False if "dir" in value and value.get("dir") not in ("ltr", "rtl"): @@ -497,7 +492,7 @@ def fontInfoWOFFMetadataExtensionValueValidator(value): """ 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): return False if "dir" in value and value.get("dir") not in ("ltr", "rtl"): @@ -528,7 +523,7 @@ def guidelinesValidator(value, identifiers=None): _guidelineDictPrototype = dict( 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) ) def guidelineValidator(value): @@ -590,8 +585,8 @@ def anchorsValidator(value, identifiers=None): _anchorDictPrototype = dict( 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) ) def anchorValidator(value): @@ -632,7 +627,7 @@ def identifierValidator(value): """ validCharactersMin = 0x20 validCharactersMax = 0x7E - if not isinstance(value, basestring): + if not isinstance(value, str): return False if not value: return False @@ -691,7 +686,7 @@ def colorValidator(value): >>> colorValidator("1, 1, 1, 1") True """ - if not isinstance(value, basestring): + if not isinstance(value, str): return False parts = value.split(",") if len(parts) != 4: @@ -725,11 +720,11 @@ def colorValidator(value): pngSignature = b"\x89PNG\r\n\x1a\n" _imageDictPrototype = dict( - fileName=(basestring, True), + fileName=(str, True), xScale=((int, float), False), xyScale=((int, float), False), yxScale=((int, float), False), yScale=((int, float), False), xOffset=((int, float), False), yOffset=((int, float), False), - color=(basestring, False) + color=(str, False) ) def imageValidator(value): @@ -796,7 +791,7 @@ def layerContentsValidator(value, ufoPathOrFileSystem): if not len(entry) == 2: return False, bogusFileMessage for i in entry: - if not isinstance(i, basestring): + if not isinstance(i, str): return False, bogusFileMessage layerName, directoryName = entry # check directory naming @@ -880,7 +875,7 @@ def groupsValidator(value): firstSideMapping = {} secondSideMapping = {} for groupName, glyphList in value.items(): - if not isinstance(groupName, (basestring)): + if not isinstance(groupName, (str)): return False, bogusFormatMessage if not isinstance(glyphList, (list, tuple)): return False, bogusFormatMessage @@ -898,7 +893,7 @@ def groupsValidator(value): else: d = secondSideMapping 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 if glyphName in d: return False, "The glyph \"%s\" occurs in too many kerning groups." % glyphName @@ -936,12 +931,12 @@ def kerningValidator(data): if not isinstance(data, Mapping): return False, bogusFormatMessage for first, secondDict in data.items(): - if not isinstance(first, basestring): + if not isinstance(first, str): return False, bogusFormatMessage elif not isinstance(secondDict, Mapping): return False, bogusFormatMessage for second, value in secondDict.items(): - if not isinstance(second, basestring): + if not isinstance(second, str): return False, bogusFormatMessage elif not isinstance(value, numberTypes): return False, bogusFormatMessage @@ -982,7 +977,7 @@ def fontLibValidator(value): >>> valid False >>> print(msg) - The lib key is not properly formatted: expected basestring, found int: 1 + The lib key is not properly formatted: expected str, found int: 1 >>> lib = {"public.glyphOrder" : "hello"} >>> valid, msg = fontLibValidator(lib) @@ -996,15 +991,15 @@ def fontLibValidator(value): >>> valid False >>> print(msg) # doctest: +ELLIPSIS - public.glyphOrder is not properly formatted: expected basestring,... + public.glyphOrder is not properly formatted: expected str,... """ if not isDictEnough(value): reason = "expected a dictionary, found %s" % type(value).__name__ return False, _bogusLibFormatMessage % reason for key, value in value.items(): - if not isinstance(key, basestring): + if not isinstance(key, str): return False, ( - "The lib key is not properly formatted: expected basestring, found %s: %r" % + "The lib key is not properly formatted: expected str, found %s: %r" % (type(key).__name__, key)) # public.glyphOrder if key == "public.glyphOrder": @@ -1013,8 +1008,8 @@ def fontLibValidator(value): reason = "expected list or tuple, found %s" % type(value).__name__ return False, bogusGlyphOrderMessage % reason for glyphName in value: - if not isinstance(glyphName, basestring): - reason = "expected basestring, found %s" % type(glyphName).__name__ + if not isinstance(glyphName, str): + reason = "expected str, found %s" % type(glyphName).__name__ return False, bogusGlyphOrderMessage % reason return True, None @@ -1050,7 +1045,7 @@ def glyphLibValidator(value): reason = "expected a dictionary, found %s" % type(value).__name__ return False, _bogusLibFormatMessage % reason for key, value in value.items(): - if not isinstance(key, basestring): + if not isinstance(key, str): reason = "key (%s) should be a string" % key return False, _bogusLibFormatMessage % reason # public.markColor diff --git a/Tests/ufoLib/GLIF1_test.py b/Tests/ufoLib/GLIF1_test.py index b20c37690..85fcc71f8 100644 --- a/Tests/ufoLib/GLIF1_test.py +++ b/Tests/ufoLib/GLIF1_test.py @@ -3,10 +3,6 @@ from fontTools.ufoLib.glifLib import GlifLibError, readGlyphFromString, writeGly from .testSupport import Glyph, stripText from itertools import islice -try: - basestring -except NameError: - basestring = str # ---------- # Test Cases # ---------- @@ -14,9 +10,9 @@ except NameError: class TestGLIF1(unittest.TestCase): def assertEqual(self, first, second, msg=None): - if isinstance(first, basestring): + if isinstance(first, str): first = stripText(first) - if isinstance(second, basestring): + if isinstance(second, str): second = stripText(second) return super().assertEqual(first, second, msg=msg) diff --git a/Tests/ufoLib/GLIF2_test.py b/Tests/ufoLib/GLIF2_test.py index c3e946441..ab9495db5 100644 --- a/Tests/ufoLib/GLIF2_test.py +++ b/Tests/ufoLib/GLIF2_test.py @@ -3,10 +3,6 @@ from fontTools.ufoLib.glifLib import GlifLibError, readGlyphFromString, writeGly from .testSupport import Glyph, stripText from itertools import islice -try: - basestring -except NameError: - basestring = str # ---------- # Test Cases # ---------- @@ -14,9 +10,9 @@ except NameError: class TestGLIF2(unittest.TestCase): def assertEqual(self, first, second, msg=None): - if isinstance(first, basestring): + if isinstance(first, str): first = stripText(first) - if isinstance(second, basestring): + if isinstance(second, str): second = stripText(second) return super().assertEqual(first, second, msg=msg) diff --git a/Tests/ufoLib/UFO3_test.py b/Tests/ufoLib/UFO3_test.py index a445bec38..cff780626 100644 --- a/Tests/ufoLib/UFO3_test.py +++ b/Tests/ufoLib/UFO3_test.py @@ -3,7 +3,6 @@ import shutil import unittest import tempfile from io import open -from fontTools.misc.py23 import unicode from fontTools.ufoLib import UFOReader, UFOWriter, UFOLibError from fontTools.ufoLib.glifLib import GlifLibError from fontTools.misc import plistlib @@ -4151,7 +4150,7 @@ class UFO3WriteLayersTestCase(unittest.TestCase): ] self.assertEqual(expected, result) for layerName, directory in result: - assert isinstance(layerName, unicode) + assert isinstance(layerName, str) # ----- # /data diff --git a/Tests/ufoLib/testSupport.py b/Tests/ufoLib/testSupport.py index caaab30be..49f6a5393 100755 --- a/Tests/ufoLib/testSupport.py +++ b/Tests/ufoLib/testSupport.py @@ -3,10 +3,6 @@ import os from fontTools.ufoLib.utils import numberTypes -try: - basestring -except NameError: - basestring = str def getDemoFontPath(): """Return the path to Data/DemoFont.ufo/.""" @@ -102,7 +98,7 @@ def _dictToString(d): value = _tupleToString(value) elif isinstance(value, numberTypes): value = repr(value) - elif isinstance(value, basestring): + elif isinstance(value, str): value = "\"%s\"" % value text.append(f"{key} : {value}") if not text: @@ -120,7 +116,7 @@ def _listToString(l): value = _tupleToString(value) elif isinstance(value, numberTypes): value = repr(value) - elif isinstance(value, basestring): + elif isinstance(value, str): value = "\"%s\"" % value text.append(value) if not text: @@ -138,7 +134,7 @@ def _tupleToString(t): value = _tupleToString(value) elif isinstance(value, numberTypes): value = repr(value) - elif isinstance(value, basestring): + elif isinstance(value, str): value = "\"%s\"" % value text.append(value) if not text: