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):