| import logging |
| import shutil |
| |
| from fontTools.misc import plistlib |
| from fontTools.ufoLib import UFOReader, UFOWriter, UFOFormatVersion |
| from fontTools.ufoLib.errors import UFOLibError, UnsupportedUFOFormat |
| import pytest |
| |
| |
| @pytest.fixture |
| def ufo_path(tmp_path): |
| ufodir = tmp_path / "TestFont.ufo" |
| ufodir.mkdir() |
| with (ufodir / "metainfo.plist").open("wb") as f: |
| plistlib.dump({"creator": "pytest", "formatVersion": 3}, f) |
| (ufodir / "glyphs").mkdir() |
| with (ufodir / "layercontents.plist").open("wb") as f: |
| plistlib.dump([("public.default", "glyphs")], f) |
| return ufodir |
| |
| |
| def test_formatVersion_deprecated(ufo_path): |
| reader = UFOReader(ufo_path) |
| |
| with pytest.warns(DeprecationWarning) as warnings: |
| assert reader.formatVersion == 3 |
| |
| assert len(warnings) == 1 |
| assert "is deprecated; use the 'formatVersionTuple'" in warnings[0].message.args[0] |
| |
| |
| def test_formatVersionTuple(ufo_path): |
| reader = UFOReader(ufo_path) |
| |
| assert reader.formatVersionTuple == (3, 0) |
| assert reader.formatVersionTuple.major == 3 |
| assert reader.formatVersionTuple.minor == 0 |
| assert str(reader.formatVersionTuple) == "3.0" |
| |
| |
| def test_readMetaInfo_errors(ufo_path): |
| (ufo_path / "metainfo.plist").unlink() |
| with pytest.raises(UFOLibError, match="'metainfo.plist' is missing"): |
| UFOReader(ufo_path) |
| |
| (ufo_path / "metainfo.plist").write_bytes(plistlib.dumps({})) |
| with pytest.raises(UFOLibError, match="Missing required formatVersion"): |
| UFOReader(ufo_path) |
| |
| (ufo_path / "metainfo.plist").write_bytes(plistlib.dumps([])) |
| with pytest.raises(UFOLibError, match="metainfo.plist is not properly formatted"): |
| UFOReader(ufo_path) |
| |
| |
| def test_readMetaInfo_unsupported_format_version(ufo_path, caplog): |
| metainfo = {"formatVersion": 10, "formatVersionMinor": 15} |
| (ufo_path / "metainfo.plist").write_bytes(plistlib.dumps(metainfo)) |
| |
| with pytest.raises(UnsupportedUFOFormat): |
| UFOReader(ufo_path) # validate=True by default |
| |
| with pytest.raises(UnsupportedUFOFormat): |
| UFOReader(ufo_path, validate=True) |
| |
| caplog.clear() |
| with caplog.at_level(logging.WARNING, logger="fontTools.ufoLib"): |
| UFOReader(ufo_path, validate=False) |
| |
| assert len(caplog.records) == 1 |
| assert "Unsupported UFO format" in caplog.text |
| assert "Assuming the latest supported version" in caplog.text |
| |
| |
| def test_UFOWriter_formatVersion(tmp_path): |
| ufo_path = tmp_path / "TestFont.ufo" |
| with UFOWriter(ufo_path, formatVersion=3) as writer: |
| assert writer.formatVersionTuple == (3, 0) |
| |
| shutil.rmtree(str(ufo_path)) |
| with UFOWriter(ufo_path, formatVersion=(2, 0)) as writer: |
| assert writer.formatVersionTuple == (2, 0) |
| |
| |
| def test_UFOWriter_formatVersion_default_latest(tmp_path): |
| writer = UFOWriter(tmp_path / "TestFont.ufo") |
| assert writer.formatVersionTuple == UFOFormatVersion.default() |
| |
| |
| def test_UFOWriter_unsupported_format_version(tmp_path): |
| with pytest.raises(UnsupportedUFOFormat): |
| UFOWriter(tmp_path, formatVersion=(123, 456)) |
| |
| |
| def test_UFOWriter_previous_higher_format_version(ufo_path): |
| with pytest.raises( |
| UnsupportedUFOFormat, match="UFO located at this path is a higher version" |
| ): |
| UFOWriter(ufo_path, formatVersion=(2, 0)) |