def test_write_instance(self): instance = classes.GSInstance() # List of properties from https://docu.glyphsapp.com/#gsinstance # active # FIXME: (jany) does not seem to be handled by this library? No doc? instance.active = True # name instance.name = "SemiBoldCompressed (name)" # weight instance.weight = "SemiBold (weight)" # width instance.width = "Compressed (width)" # weightValue instance.weightValue = 600 # widthValue instance.widthValue = 200 # customValue instance.customValue = 0.4 # isItalic instance.isItalic = True # isBold instance.isBold = True # linkStyle instance.linkStyle = "linked style value" # familyName instance.familyName = "Sans Rien (familyName)" # preferredFamily instance.preferredFamily = "Sans Rien (preferredFamily)" # preferredSubfamilyName instance.preferredSubfamilyName = "Semi Bold Compressed (preferredSubFamilyName)" # windowsFamily instance.windowsFamily = "Sans Rien MS (windowsFamily)" # windowsStyle: read only # windowsLinkedToStyle: read only # fontName instance.fontName = "SansRien (fontName)" # fullName instance.fullName = "Sans Rien Semi Bold Compressed (fullName)" # customParameters instance.customParameters['hheaLineGap'] = 10 # instanceInterpolations instance.instanceInterpolations = { 'M1': 0.2, 'M2': 0.8 } # manualInterpolation instance.manualInterpolation = True # interpolatedFont: read only # FIXME: (jany) the weight and width are not in the output # confusion with weightClass/widthClass? self.assertWrites(instance, dedent("""\ { customParameters = ( { name = famiyName; value = "Sans Rien (familyName)"; }, { name = preferredFamily; value = "Sans Rien (preferredFamily)"; }, { name = preferredSubfamilyName; value = "Semi Bold Compressed (preferredSubFamilyName)"; }, { name = styleMapFamilyName; value = "Sans Rien MS (windowsFamily)"; }, { name = postscriptFontName; value = "SansRien (fontName)"; }, { name = postscriptFullName; value = "Sans Rien Semi Bold Compressed (fullName)"; }, { name = hheaLineGap; value = 10; } ); interpolationCustom = 0.4; interpolationWeight = 600; interpolationWidth = 200; instanceInterpolations = { M1 = 0.2; M2 = 0.8; }; isBold = 1; isItalic = 1; linkStyle = "linked style value"; manualInterpolation = 1; name = "SemiBoldCompressed (name)"; } """))
def test_write_font_attributes(self): """Test the writer on all GSFont attributes""" font = classes.GSFont() # List of properties from https://docu.glyphsapp.com/#gsfont # parent: not handled because it's internal and read-only # masters m1 = classes.GSFontMaster() m1.id = "M1" font.masters.insert(0, m1) m2 = classes.GSFontMaster() m2.id = "M2" font.masters.insert(1, m2) # instances i1 = classes.GSInstance() i1.name = "MuchBold" font.instances.append(i1) # glyphs g1 = classes.GSGlyph() g1.name = 'G1' font.glyphs.append(g1) # classes c1 = classes.GSClass() c1.name = "C1" font.classes.append(c1) # features f1 = classes.GSFeature() f1.name = "F1" font.features.append(f1) # featurePrefixes fp1 = classes.GSFeaturePrefix() fp1 = "FP1" font.featurePrefixes.append(fp1) # copyright font.copyright = "Copyright Bob" # designer font.designer = "Bob" # designerURL font.designerURL = "bob.me" # manufacturer font.manufacturer = "Manu" # manufacturerURL font.manufacturerURL = "manu.com" # versionMajor font.versionMajor = 2 # versionMinor font.versionMinor = 104 # date font.date = glyphs_datetime('2017-10-03 07:35:46 +0000') # familyName font.familyName = "Sans Rien" # upm font.upm = 2000 # note font.note = "Was bored, made this" # kerning font.kerning = OrderedDict([ ('M1', OrderedDict([ ('@MMK_L_G1', OrderedDict([ ('@MMK_R_G1', 0.1) ])) ])) ]) # userData font.userData = { 'a': 'test', 'b': [1, {'c': 2}], 'd': [1, "1"], } # grid -> gridLength font.grid = 35 # gridSubDivisions font.gridSubDivisions = 5 # keyboardIncrement font.keyboardIncrement = 1.2 # disablesNiceNames font.disablesNiceNames = True # customParameters font.customParameters['ascender'] = 300 # selection: not written # selectedLayers: not written # selectedFontMaster: not written # masterIndex: not written # currentText: not written # tabs: not written # currentTab: not written # filepath: not written # tool: not written # tools: not handled because it is a read-only list of GUI features # .appVersion (extra property that is not in the docs!) font.appVersion = "895" self.assertWrites(font, dedent("""\ { .appVersion = "895"; classes = ( { code = ""; name = C1; } ); copyright = "Copyright Bob"; customParameters = ( { name = note; value = "Was bored, made this"; }, { name = ascender; value = 300; } ); date = "2017-10-03 07:35:46 +0000"; designer = Bob; designerURL = bob.me; disablesNiceNames = 1; familyName = "Sans Rien"; featurePrefixes = ( FP1 ); features = ( { code = ""; name = F1; } ); fontMaster = ( { ascender = 800; capHeight = 700; id = M1; xHeight = 500; }, { ascender = 800; capHeight = 700; id = M2; xHeight = 500; } ); glyphs = ( { glyphname = G1; } ); gridLength = 35; gridSubDivision = 5; instances = ( { name = MuchBold; } ); kerning = { M1 = { "@MMK_L_G1" = { "@MMK_R_G1" = 0.1; }; }; }; keyboardIncrement = 1.2; manufacturer = Manu; manufacturerURL = manu.com; unitsPerEm = 2000; userData = { a = test; b = ( 1, { c = 2; } ); d = ( 1, "1" ); }; versionMajor = 2; versionMinor = 104; } """)) # Don't write the keyboardIncrement if it's 1 (default) font.keyboardIncrement = 1 written = test_helpers.write_to_lines(font) self.assertFalse(any("keyboardIncrement" in line for line in written))
def test_write_instance(self): instance = classes.GSInstance() # List of properties from https://docu.glyphsapp.com/#gsinstance # active instance.active = True # name instance.name = "SemiBoldCompressed (name)" # weight instance.weight = "SemiBold (weight)" # width instance.width = "Compressed (width)" # weightValue instance.weightValue = 600 # widthValue instance.widthValue = 200 # customValue instance.customValue = 0.4 # isItalic instance.isItalic = True # isBold instance.isBold = True # linkStyle instance.linkStyle = "linked style value" # familyName instance.familyName = "Sans Rien (familyName)" # preferredFamily instance.preferredFamily = "Sans Rien (preferredFamily)" # preferredSubfamilyName instance.preferredSubfamilyName = ( "Semi Bold Compressed (preferredSubFamilyName)") # windowsFamily instance.windowsFamily = "Sans Rien MS (windowsFamily)" # windowsStyle: read only # windowsLinkedToStyle: read only # fontName instance.fontName = "SansRien (fontName)" # fullName instance.fullName = "Sans Rien Semi Bold Compressed (fullName)" # customParameters instance.customParameters["hheaLineGap"] = 10 # instanceInterpolations instance.instanceInterpolations = {"M1": 0.2, "M2": 0.8} # manualInterpolation instance.manualInterpolation = True # interpolatedFont: read only self.assertWrites( instance, dedent("""\ { customParameters = ( { name = familyName; value = "Sans Rien (familyName)"; }, { name = preferredFamily; value = "Sans Rien (preferredFamily)"; }, { name = preferredSubfamilyName; value = "Semi Bold Compressed (preferredSubFamilyName)"; }, { name = styleMapFamilyName; value = "Sans Rien MS (windowsFamily)"; }, { name = postscriptFontName; value = "SansRien (fontName)"; }, { name = postscriptFullName; value = "Sans Rien Semi Bold Compressed (fullName)"; }, { name = hheaLineGap; value = 10; } ); interpolationCustom = 0.4; interpolationWeight = 600; interpolationWidth = 200; instanceInterpolations = { M1 = 0.2; M2 = 0.8; }; isBold = 1; isItalic = 1; linkStyle = "linked style value"; manualInterpolation = 1; name = "SemiBoldCompressed (name)"; weightClass = "SemiBold (weight)"; widthClass = "Compressed (width)"; } """), )