From deca398915e92f24fe698e2e7d0e13122f61383e Mon Sep 17 00:00:00 2001 From: jvr Date: Tue, 16 Sep 2003 11:30:29 +0000 Subject: [PATCH] more doctests git-svn-id: svn://svn.code.sf.net/p/fonttools/code/trunk@455 4cde692c-a291-49d1-8350-778aa11640f8 --- Lib/fontTools/misc/transform.py | 91 +++++++++++++++++++++++++++++++-- 1 file changed, 86 insertions(+), 5 deletions(-) diff --git a/Lib/fontTools/misc/transform.py b/Lib/fontTools/misc/transform.py index d41985237..769475f0d 100755 --- a/Lib/fontTools/misc/transform.py +++ b/Lib/fontTools/misc/transform.py @@ -84,6 +84,16 @@ class Transform: """ def __init__(self, xx=1, xy=0, yx=0, yy=1, dx=0, dy=0): + """Transform's constructor takes six arguments, all of which are + optional, and can be used as keyword arguments: + >>> Transform(12) + + >>> Transform(dx=12) + + >>> Transform(yx=12) + + >>> + """ self.__affine = xx, xy, yx, yy, dx, dy def transformPoint(self, (x, y)): @@ -212,9 +222,12 @@ class Transform: """Return the inverse transformation. Example: - >>> t = Transform(2, 0, 0, 3, 1, 6) - >>> t.inverse() - + >>> t = Identity.translate(2, 3).scale(4, 5) + >>> t.transformPoint((10, 20)) + (42, 103) + >>> it = t.inverse() + >>> it.transformPoint((42, 103)) + (10.0, 20.0) >>> """ if self.__affine == (1, 0, 0, 1, 0, 0): @@ -226,24 +239,92 @@ class Transform: return self.__class__(xx, xy, yx, yy, dx, dy) def toPS(self): + """Return a PostScript representation: + >>> t = Identity.scale(2, 3).translate(4, 5) + >>> t.toPS() + '[2 0 0 3 8 15]' + >>> + """ return "[%s %s %s %s %s %s]" % self.__affine def __len__(self): + """Transform instances also behave like sequences of length 6: + >>> len(Identity) + 6 + >>> + """ return 6 def __getitem__(self, index): + """Transform instances also behave like sequences of length 6: + >>> list(Identity) + [1, 0, 0, 1, 0, 0] + >>> tuple(Identity) + (1, 0, 0, 1, 0, 0) + >>> + """ return self.__affine[index] def __getslice__(self, i, j): + """Transform instances also behave like sequences and even support + slicing: + >>> t = Offset(100, 200) + >>> t + + >>> t[4:] + (100, 200) + >>> + """ return self.__affine[i:j] def __cmp__(self, other): + """Transform instances are comparable: + >>> t1 = Identity.scale(2, 3).translate(4, 6) + >>> t2 = Identity.translate(8, 18).scale(2, 3) + >>> t1 == t2 + 1 + >>> + + But beware of floating point rounding errors: + >>> t1 = Identity.scale(0.2, 0.3).translate(0.4, 0.6) + >>> t2 = Identity.translate(0.08, 0.18).scale(0.2, 0.3) + >>> t1 + + >>> t2 + + >>> t1 == t2 + 0 + >>> + """ xx1, xy1, yx1, yy1, dx1, dy1 = self.__affine xx2, xy2, yx2, yy2, dx2, dy2 = other return cmp((xx1, xy1, yx1, yy1, dx1, dy1), (xx2, xy2, yx2, yy2, dx2, dy2)) def __hash__(self): + """Transform instances are hashable, meaning you can use them as + keys in dictionaries: + >>> d = {Scale(12, 13): None} + >>> d + {: None} + >>> + + But again, beware of floating point rounding errors: + >>> t1 = Identity.scale(0.2, 0.3).translate(0.4, 0.6) + >>> t2 = Identity.translate(0.08, 0.18).scale(0.2, 0.3) + >>> t1 + + >>> t2 + + >>> d = {t1: None} + >>> d + {: None} + >>> d[t2] + Traceback (most recent call last): + File "", line 1, in ? + KeyError: + >>> + """ return hash(self.__affine) def __repr__(self): @@ -278,8 +359,8 @@ def Scale(x, y=None): def _test(): - import doctest, fontTools.misc.transform - return doctest.testmod(fontTools.misc.transform) + import doctest, transform + return doctest.testmod(transform) if __name__ == "__main__": _test()