diff --git a/Lib/fontTools/misc/testTools.py b/Lib/fontTools/misc/testTools.py index db316a827..c29d7ca4d 100644 --- a/Lib/fontTools/misc/testTools.py +++ b/Lib/fontTools/misc/testTools.py @@ -3,6 +3,7 @@ from collections.abc import Iterable from io import BytesIO import os +import re import shutil import sys import tempfile @@ -133,6 +134,31 @@ def getXML(func, ttFont=None): return xml.splitlines() +def stripVariableItemsFromTTX( + string: str, + ttLibVersion: bool = True, + checkSumAdjustment: bool = True, + modified: bool = True, + created: bool = True, + sfntVersion: bool = False, # opt-in only +) -> str: + """Strip stuff like ttLibVersion, checksums, timestamps, etc. from TTX dumps.""" + # ttlib changes with the fontTools version + if ttLibVersion: + string = re.sub(' ttLibVersion="[^"]+"', "", string) + # sometimes (e.g. some subsetter tests) we don't care whether it's OTF or TTF + if sfntVersion: + string = re.sub(' sfntVersion="[^"]+"', "", string) + # head table checksum and creation and mod date changes with each save. + if checkSumAdjustment: + string = re.sub('', "", string) + if modified: + string = re.sub('', "", string) + if created: + string = re.sub('', "", string) + return string + + class MockFont(object): """A font-like object that automatically adds any looked up glyphname to its glyphOrder.""" diff --git a/Tests/fontBuilder/fontBuilder_test.py b/Tests/fontBuilder/fontBuilder_test.py index 6368cb876..775e94d9a 100644 --- a/Tests/fontBuilder/fontBuilder_test.py +++ b/Tests/fontBuilder/fontBuilder_test.py @@ -1,13 +1,13 @@ import os import pytest -import re from fontTools.ttLib import TTFont from fontTools.pens.ttGlyphPen import TTGlyphPen from fontTools.pens.t2CharStringPen import T2CharStringPen from fontTools.fontBuilder import FontBuilder from fontTools.ttLib.tables.TupleVariation import TupleVariation from fontTools.misc.psCharStrings import T2CharString +from fontTools.misc.testTools import stripVariableItemsFromTTX def getTestData(fileName, mode="r"): @@ -16,16 +16,6 @@ def getTestData(fileName, mode="r"): return f.read() -def strip_VariableItems(string): - # ttlib changes with the fontTools version - string = re.sub(' ttLibVersion=".*"', '', string) - # head table checksum and creation and mod date changes with each save. - string = re.sub('', '', string) - string = re.sub('', '', string) - string = re.sub('', '', string) - return string - - def drawTestGlyph(pen): pen.moveTo((100, 100)) pen.lineTo((100, 1000)) @@ -91,8 +81,8 @@ def _verifyOutput(outPath, tables=None): f = TTFont(outPath) f.saveXML(outPath + ".ttx", tables=tables) with open(outPath + ".ttx") as f: - testData = strip_VariableItems(f.read()) - refData = strip_VariableItems(getTestData(os.path.basename(outPath) + ".ttx")) + testData = stripVariableItemsFromTTX(f.read()) + refData = stripVariableItemsFromTTX(getTestData(os.path.basename(outPath) + ".ttx")) assert refData == testData diff --git a/Tests/subset/data/expect_lcar_0.ttx b/Tests/subset/data/expect_lcar_0.ttx index feb866d7f..0edcaa111 100644 --- a/Tests/subset/data/expect_lcar_0.ttx +++ b/Tests/subset/data/expect_lcar_0.ttx @@ -12,5 +12,5 @@ - + diff --git a/Tests/subset/data/expect_lcar_1.ttx b/Tests/subset/data/expect_lcar_1.ttx index 26b500823..72b4aabc6 100644 --- a/Tests/subset/data/expect_lcar_1.ttx +++ b/Tests/subset/data/expect_lcar_1.ttx @@ -12,5 +12,5 @@ - + diff --git a/Tests/subset/data/expect_opbd_0.ttx b/Tests/subset/data/expect_opbd_0.ttx index 55842a01c..3f6c41991 100644 --- a/Tests/subset/data/expect_opbd_0.ttx +++ b/Tests/subset/data/expect_opbd_0.ttx @@ -14,5 +14,5 @@ - + diff --git a/Tests/subset/data/expect_opbd_1.ttx b/Tests/subset/data/expect_opbd_1.ttx index 080abd914..7b40401b4 100644 --- a/Tests/subset/data/expect_opbd_1.ttx +++ b/Tests/subset/data/expect_opbd_1.ttx @@ -14,5 +14,5 @@ - + diff --git a/Tests/subset/data/expect_prop_0.ttx b/Tests/subset/data/expect_prop_0.ttx index f8ca15093..64201e129 100644 --- a/Tests/subset/data/expect_prop_0.ttx +++ b/Tests/subset/data/expect_prop_0.ttx @@ -7,5 +7,5 @@ - + diff --git a/Tests/subset/data/expect_prop_1.ttx b/Tests/subset/data/expect_prop_1.ttx index f7f2d23c6..a582ac21c 100644 --- a/Tests/subset/data/expect_prop_1.ttx +++ b/Tests/subset/data/expect_prop_1.ttx @@ -10,5 +10,5 @@ - + diff --git a/Tests/subset/subset_test.py b/Tests/subset/subset_test.py index d195af0fe..dbc410a81 100644 --- a/Tests/subset/subset_test.py +++ b/Tests/subset/subset_test.py @@ -1,5 +1,5 @@ import io -from fontTools.misc.testTools import getXML +from fontTools.misc.testTools import getXML, stripVariableItemsFromTTX from fontTools.misc.textTools import tobytes, tostr from fontTools import subset from fontTools.fontBuilder import FontBuilder @@ -48,15 +48,10 @@ class SubsetTest(unittest.TestCase): "tmp%d%s" % (self.num_tempfiles, suffix)) def read_ttx(self, path): - lines = [] - with open(path, "r", encoding="utf-8") as ttx: - for line in ttx.readlines(): - # Elide ttFont attributes because ttLibVersion may change. - if line.startswith("\n") - else: - lines.append(line.rstrip() + "\n") - return lines + with open(path, "r", encoding="utf-8") as f: + ttx = f.read() + # don't care whether TTF or OTF, thus strip sfntVersion as well + return stripVariableItemsFromTTX(ttx, sfntVersion=True).splitlines(True) def expect_ttx(self, font, expected_ttx, tables=None): path = self.temp_path(suffix=".ttx") diff --git a/Tests/varLib/instancer/instancer_test.py b/Tests/varLib/instancer/instancer_test.py index bb2d17585..b9d4ffe9b 100644 --- a/Tests/varLib/instancer/instancer_test.py +++ b/Tests/varLib/instancer/instancer_test.py @@ -1,4 +1,5 @@ from fontTools.misc.fixedTools import floatToFixedToFloat +from fontTools.misc.testTools import stripVariableItemsFromTTX from fontTools.misc.textTools import Tag from fontTools import ttLib from fontTools import designspaceLib @@ -1386,10 +1387,6 @@ def test_setMacOverlapFlags(): assert b.components[0].flags & flagOverlapCompound != 0 -def _strip_ttLibVersion(string): - return re.sub(' ttLibVersion=".*"', "", string) - - @pytest.fixture def varfont2(): f = ttLib.TTFont(recalcTimestamp=False) @@ -1412,7 +1409,7 @@ def _dump_ttx(ttFont): ttFont2 = ttLib.TTFont(tmp, recalcBBoxes=False, recalcTimestamp=False) s = StringIO() ttFont2.saveXML(s) - return _strip_ttLibVersion(s.getvalue()) + return stripVariableItemsFromTTX(s.getvalue()) def _get_expected_instance_ttx( @@ -1428,7 +1425,7 @@ def _get_expected_instance_ttx( "r", encoding="utf-8", ) as fp: - return _strip_ttLibVersion(fp.read()) + return stripVariableItemsFromTTX(fp.read()) class InstantiateVariableFontTest(object):