From 35c46aa0e2825f617a4e66626fa3676e023cfc2b Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Fri, 11 Mar 2016 13:31:16 +0000 Subject: [PATCH 1/3] [ttProgram] add __eq__ and __ne__ methods to Program class --- Lib/fontTools/ttLib/tables/ttProgram.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Lib/fontTools/ttLib/tables/ttProgram.py b/Lib/fontTools/ttLib/tables/ttProgram.py index 43fa55741..000e5385a 100644 --- a/Lib/fontTools/ttLib/tables/ttProgram.py +++ b/Lib/fontTools/ttLib/tables/ttProgram.py @@ -496,6 +496,15 @@ class Program(object): __nonzero__ = __bool__ + def __eq__(self, other): + if type(self) != type(other): + return NotImplemented + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + result = self.__eq__(other) + return result if result is NotImplemented else not result + def _test(): """ From d4b9a2bec391e0f9fa3578c9186b5e95b0096fbc Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Fri, 11 Mar 2016 15:10:27 +0000 Subject: [PATCH 2/3] [ttGlyphPen_test] ttProgram has __eq__ now, remove unnecessary assignments previously assertEqual would fail, despite the `program` attributes where both empty, as the object have different id(). The Program.__eq__ method now compares self.__dict__ == other.__dict__, hence the test pass. --- Lib/fontTools/pens/ttGlyphPen_test.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/Lib/fontTools/pens/ttGlyphPen_test.py b/Lib/fontTools/pens/ttGlyphPen_test.py index bc6f66e62..67179f4b8 100644 --- a/Lib/fontTools/pens/ttGlyphPen_test.py +++ b/Lib/fontTools/pens/ttGlyphPen_test.py @@ -68,7 +68,6 @@ class TTGlyphPenTest(unittest.TestCase): pen.endPath() endPathGlyph = pen.glyph() - endPathGlyph.program = closePathGlyph.program self.assertEqual(closePathGlyph, endPathGlyph) def test_glyph_errorOnUnendedContour(self): @@ -105,7 +104,6 @@ class TTGlyphPenTest(unittest.TestCase): pen.closePath() plainGlyph = pen.glyph() - plainGlyph.program = compositeGlyph.program self.assertEqual(plainGlyph, compositeGlyph) From d82a31dd5712c7683408c85f2e12a7fafe7a7ab2 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Fri, 11 Mar 2016 14:56:11 +0000 Subject: [PATCH 3/3] return NotImplemented from __ne__ if __eq__ returns NotImplemented MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit otherwise `not NotImplemented` (always False) is returned from __ne__ when `type(self) != type(other)`, leading to illogic results like: >>> from fontTools.ttLib.tables.DefaultTable import DefaultTable >>> t = DefaultTable('test') >>> t == 0 False >>> t != 0 False The latterĀ of course should return True. --- Lib/fontTools/ttLib/tables/DefaultTable.py | 6 ++++-- Lib/fontTools/ttLib/tables/_g_l_y_f.py | 16 ++++++++++------ Lib/fontTools/ttLib/tables/_t_r_a_k.py | 11 +++++------ Lib/fontTools/ttLib/tables/otBase.py | 12 +++++++++--- 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/Lib/fontTools/ttLib/tables/DefaultTable.py b/Lib/fontTools/ttLib/tables/DefaultTable.py index 544520783..1a34da3a8 100644 --- a/Lib/fontTools/ttLib/tables/DefaultTable.py +++ b/Lib/fontTools/ttLib/tables/DefaultTable.py @@ -39,9 +39,11 @@ class DefaultTable(object): def __repr__(self): return "<'%s' table at %x>" % (self.tableTag, id(self)) - def __ne__(self, other): - return not self.__eq__(other) def __eq__(self, other): if type(self) != type(other): return NotImplemented return self.__dict__ == other.__dict__ + + def __ne__(self, other): + result = self.__eq__(other) + return result if result is NotImplemented else not result diff --git a/Lib/fontTools/ttLib/tables/_g_l_y_f.py b/Lib/fontTools/ttLib/tables/_g_l_y_f.py index 5fe6d91c4..1bc084d5d 100644 --- a/Lib/fontTools/ttLib/tables/_g_l_y_f.py +++ b/Lib/fontTools/ttLib/tables/_g_l_y_f.py @@ -979,13 +979,14 @@ class Glyph(object): cFlags = cFlags[nextOnCurve:] pen.closePath() - def __ne__(self, other): - return not self.__eq__(other) def __eq__(self, other): if type(self) != type(other): return NotImplemented return self.__dict__ == other.__dict__ + def __ne__(self, other): + result = self.__eq__(other) + return result if result is NotImplemented else not result class GlyphComponent(object): @@ -1141,13 +1142,15 @@ class GlyphComponent(object): self.transform = [[scale, 0], [0, scale]] self.flags = safeEval(attrs["flags"]) - def __ne__(self, other): - return not self.__eq__(other) def __eq__(self, other): if type(self) != type(other): return NotImplemented return self.__dict__ == other.__dict__ + def __ne__(self, other): + result = self.__eq__(other) + return result if result is NotImplemented else not result + class GlyphCoordinates(object): def __init__(self, iterable=[], typecode="h"): @@ -1261,13 +1264,14 @@ class GlyphCoordinates(object): py = x * t[0][1] + y * t[1][1] self[i] = (px, py) - def __ne__(self, other): - return not self.__eq__(other) def __eq__(self, other): if type(self) != type(other): return NotImplemented return self._a == other._a + def __ne__(self, other): + result = self.__eq__(other) + return result if result is NotImplemented else not result def reprflag(flag): bin = "" diff --git a/Lib/fontTools/ttLib/tables/_t_r_a_k.py b/Lib/fontTools/ttLib/tables/_t_r_a_k.py index b17598a66..467375f16 100644 --- a/Lib/fontTools/ttLib/tables/_t_r_a_k.py +++ b/Lib/fontTools/ttLib/tables/_t_r_a_k.py @@ -305,11 +305,10 @@ class TrackTableEntry(MutableMapping): return "TrackTableEntry({}, nameIndex={})".format(self._map, self.nameIndex) def __eq__(self, other): - if (isinstance(other, TrackTableEntry) - and self.nameIndex == other.nameIndex - and dict(self) == dict(other)): - return True - return False + if not isinstance(other, self.__class__): + return NotImplemented + return self.nameIndex == other.nameIndex and dict(self) == dict(other) def __ne__(self, other): - return not self.__eq__(other) + result = self.__eq__(other) + return result if result is NotImplemented else not result diff --git a/Lib/fontTools/ttLib/tables/otBase.py b/Lib/fontTools/ttLib/tables/otBase.py index 3d0277ed0..cafcfadc2 100644 --- a/Lib/fontTools/ttLib/tables/otBase.py +++ b/Lib/fontTools/ttLib/tables/otBase.py @@ -345,7 +345,9 @@ class OTTableWriter(object): return hash(self.items) def __ne__(self, other): - return not self.__eq__(other) + result = self.__eq__(other) + return result if result is NotImplemented else not result + def __eq__(self, other): if type(self) != type(other): return NotImplemented @@ -754,7 +756,9 @@ class BaseTable(object): setattr(self, conv.name, value) def __ne__(self, other): - return not self.__eq__(other) + result = self.__eq__(other) + return result if result is NotImplemented else not result + def __eq__(self, other): if type(self) != type(other): return NotImplemented @@ -933,7 +937,9 @@ class ValueRecord(object): setattr(self, name, value) def __ne__(self, other): - return not self.__eq__(other) + result = self.__eq__(other) + return result if result is NotImplemented else not result + def __eq__(self, other): if type(self) != type(other): return NotImplemented