def testRoundTripVersion2(self): font = NewFont() infoObject = font.info for attr, value in fontInfoVersion2.items(): if attr in infoObject._ufoToFLAttrMapping and infoObject._ufoToFLAttrMapping[ attr]["nakedAttribute"] is None: continue setattr(infoObject, attr, value) newValue = getattr(infoObject, attr) self.assertEqual((attr, newValue), (attr, value)) font.close()
def testRoundTripVersion1(self): font = NewFont() infoObject = font.info for attr, value in fontInfoVersion1.items(): if attr not in ufoLib.deprecatedFontInfoAttributesVersion2: setattr(infoObject, attr, value) for attr, expectedValue in fontInfoVersion1.items(): if attr not in ufoLib.deprecatedFontInfoAttributesVersion2: value = getattr(infoObject, attr) self.assertEqual((attr, expectedValue), (attr, value)) font.close()
def setUpFont(self, doInfo=False, doKerning=False, doGroups=False, doLib=False, doFeatures=False): self.font = NewFont() self.ufoPath = ufoPath1 self.font.readUFO(ufoPath1, doInfo=doInfo, doKerning=doKerning, doGroups=doGroups, doLib=doLib, doFeatures=doFeatures) self.font.update()
def testInfo(self): self.setUpFont(doInfo=True) otherResults = self.compareToUFO(doInfo=False) self.assertEqual(otherResults["kerning"], False) self.assertEqual(otherResults["groups"], False) self.assertEqual(otherResults["features"], False) self.assertEqual(otherResults["lib"], False) expectedPath = os.path.join(ufoPath2, "fontinfo.plist") writtenPath = os.path.join(self.dstDir, "fontinfo.plist") expected = readPlist(expectedPath) written = readPlist(writtenPath) dummyFont = NewFont() _ufoToFLAttrMapping = dict(dummyFont.info._ufoToFLAttrMapping) dummyFont.close() for attr, expectedValue in expected.items(): # cheat by skipping attrs that aren't supported if _ufoToFLAttrMapping[attr]["nakedAttribute"] is None: continue self.assertEqual((attr, expectedValue), (attr, written[attr])) self.tearDownFont()
def testVersion1DeprecationRoundTrip(self): saveStderr = sys.stderr saveStdout = sys.stdout tempStderr = StringIO() sys.stderr = tempStderr sys.stdout = tempStderr font = NewFont() infoObject = font.info requiredWarnings = [] try: for attr, value in fontInfoVersion1.items(): if attr in ufoLib.deprecatedFontInfoAttributesVersion2: setattr(infoObject, attr, value) v = getattr(infoObject, attr) self.assertEquals((attr, value), (attr, v)) s = "DeprecationWarning: The %s attribute has been deprecated." % attr requiredWarnings.append((attr, s)) finally: sys.stderr = saveStderr sys.stdout = saveStdout tempStderr = tempStderr.getvalue() for attr, line in requiredWarnings: self.assertEquals((attr, line in tempStderr), (attr, True)) font.close()
def testVersion2UnsupportedGet(self): saveStderr = sys.stderr saveStdout = sys.stdout tempStderr = StringIO() sys.stderr = tempStderr sys.stdout = tempStderr font = NewFont() infoObject = font.info requiredWarnings = [] try: for attr, value in fontInfoVersion2.items(): if attr in infoObject._ufoToFLAttrMapping and infoObject._ufoToFLAttrMapping[ attr]["nakedAttribute"] is not None: continue getattr(infoObject, attr, value) s = "The attribute %s is not supported by FontLab." % attr requiredWarnings.append((attr, s)) finally: sys.stderr = saveStderr sys.stdout = saveStdout tempStderr = tempStderr.getvalue() for attr, line in requiredWarnings: self.assertEquals((attr, line in tempStderr), (attr, True)) font.close()
""" Remove overlap on all glyphs in a .ufo font. This script sis more than a little silly, but it demonstrates how objectsRF and objectsFL can work hand in hand. """ from robofab.objects.objectsRF import OpenFont from robofab.objects.objectsFL import NewFont from robofab.interface.all.dialogs import ProgressBar ufoFont = OpenFont(note="Select a .ufo") if ufoFont: bar = ProgressBar('Removing Overlap...', len(ufoFont)) flFont = NewFont() flGlyph = flFont.newGlyph('OverlapRemover') for ufoGlyph in ufoFont: flPen = flGlyph.getPointPen() ufoGlyph.drawPoints(flPen) flGlyph.removeOverlap() ufoPen = ufoGlyph.getPointPen() ufoGlyph.clear() flGlyph.drawPoints(ufoPen) flGlyph.clear() bar.tick() flFont.close(save=0) bar.close() ufoFont.save(doProgress=True)
def compareToUFO(self, doInfo=True, doKerning=True, doGroups=True, doLib=True, doFeatures=True): readerExpected = UFOReader(ufoPath2) readerWritten = UFOReader(self.dstDir) results = {} if doInfo: matches = True expectedPath = os.path.join(ufoPath2, "fontinfo.plist") writtenPath = os.path.join(self.dstDir, "fontinfo.plist") if not os.path.exists(writtenPath): matches = False else: dummyFont = NewFont() _ufoToFLAttrMapping = dict(dummyFont.info._ufoToFLAttrMapping) dummyFont.close() expected = readPlist(expectedPath) written = readPlist(writtenPath) for attr, expectedValue in expected.items(): # cheat by skipping attrs that aren't supported if _ufoToFLAttrMapping[attr]["nakedAttribute"] is None: continue if expectedValue != written[attr]: matches = False break results["info"] = matches if doKerning: matches = True expectedPath = os.path.join(ufoPath2, "kerning.plist") writtenPath = os.path.join(self.dstDir, "kerning.plist") if not os.path.exists(writtenPath): matches = False else: matches = readPlist(expectedPath) == readPlist(writtenPath) results["kerning"] = matches if doGroups: matches = True expectedPath = os.path.join(ufoPath2, "groups.plist") writtenPath = os.path.join(self.dstDir, "groups.plist") if not os.path.exists(writtenPath): matches = False else: matches = readPlist(expectedPath) == readPlist(writtenPath) results["groups"] = matches if doFeatures: matches = True expectedPath = os.path.join(ufoPath2, "features.fea") writtenPath = os.path.join(self.dstDir, "features.fea") if not os.path.exists(writtenPath): matches = False else: f = open(expectedPath, "r") expectedText = f.read() f.close() f = open(writtenPath, "r") writtenText = f.read() f.close() # FontLab likes to add lines to the features, so skip blank lines. expectedText = [ line for line in expectedText.splitlines() if line ] writtenText = [ line for line in writtenText.splitlines() if line ] matches = "\n".join(expectedText) == "\n".join(writtenText) results["features"] = matches if doLib: matches = True expectedPath = os.path.join(ufoPath2, "lib.plist") writtenPath = os.path.join(self.dstDir, "lib.plist") if not os.path.exists(writtenPath): matches = False else: # the test file doesn't have the glyph order # so purge it from the written writtenLib = readPlist(writtenPath) del writtenLib["org.robofab.glyphOrder"] matches = readPlist(expectedPath) == writtenLib results["lib"] = matches return results