from fontTools.misc.py23 import tostr from fontTools.ufoLib import UFOReader, UFOWriter, UFOFileStructure from fontTools.ufoLib.errors import UFOLibError, GlifLibError from fontTools.misc import plistlib import sys import os import fs.osfs import fs.tempfs import fs.memoryfs import fs.copy import pytest import warnings TESTDATA = fs.osfs.OSFS( os.path.join(os.path.dirname(__file__), "testdata") ) TEST_UFO3 = "TestFont1 (UFO3).ufo" TEST_UFOZ = "TestFont1 (UFO3).ufoz" @pytest.fixture(params=[TEST_UFO3, TEST_UFOZ]) def testufo(request): name = request.param with fs.tempfs.TempFS() as tmp: if TESTDATA.isdir(name): fs.copy.copy_dir(TESTDATA, name, tmp, name) else: fs.copy.copy_file(TESTDATA, name, tmp, name) yield tmp.getsyspath(name) @pytest.fixture def testufoz(): with fs.tempfs.TempFS() as tmp: fs.copy.copy_file(TESTDATA, TEST_UFOZ, tmp, TEST_UFOZ) yield tmp.getsyspath(TEST_UFOZ) class TestUFOZ: def test_read(self, testufoz): with UFOReader(testufoz) as reader: assert reader.fileStructure == UFOFileStructure.ZIP assert reader.formatVersion == 3 def test_write(self, testufoz): with UFOWriter(testufoz, structure="zip") as writer: writer.writeLib({"hello world": 123}) with UFOReader(testufoz) as reader: assert reader.readLib() == {"hello world": 123} def test_pathlike(testufo): class PathLike: def __init__(self, s): self._path = s def __fspath__(self): return tostr(self._path, sys.getfilesystemencoding()) path = PathLike(testufo) with UFOReader(path) as reader: assert reader._path == path.__fspath__() with UFOWriter(path) as writer: assert writer._path == path.__fspath__() def test_path_attribute_deprecated(testufo): with UFOWriter(testufo) as writer: with pytest.warns(DeprecationWarning, match="The 'path' attribute"): writer.path @pytest.fixture def memufo(): m = fs.memoryfs.MemoryFS() fs.copy.copy_dir(TESTDATA, TEST_UFO3, m, "/") return m class TestMemoryFS: def test_init_reader(self, memufo): with UFOReader(memufo) as reader: assert reader.formatVersion == 3 assert reader.fileStructure == UFOFileStructure.PACKAGE def test_init_writer(self): m = fs.memoryfs.MemoryFS() with UFOWriter(m) as writer: assert m.exists("metainfo.plist") assert writer._path == ""