-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Andreas Zeidler wrote:
Log message for revision 94907: backport r94905 to 2.10: Acquisition wrappers now correctly proxy `__iter__`.
Changed: U Zope/branches/2.10/doc/CHANGES.txt U Zope/branches/2.10/lib/python/Acquisition/_Acquisition.c U Zope/branches/2.10/lib/python/Acquisition/tests.py
-=- Modified: Zope/branches/2.10/doc/CHANGES.txt =================================================================== --- Zope/branches/2.10/doc/CHANGES.txt 2009-01-21 16:25:34 UTC (rev 94906) +++ Zope/branches/2.10/doc/CHANGES.txt 2009-01-21 16:26:38 UTC (rev 94907) @@ -19,6 +19,8 @@
Bugs fixed
+ - Acquisition wrappers now correctly proxy __iter__. + - Products.PluginIndexes.PathIndex: backported doc fixes / optiimizations from trunk (and ExtendedPathIndex).
Modified: Zope/branches/2.10/lib/python/Acquisition/_Acquisition.c =================================================================== --- Zope/branches/2.10/lib/python/Acquisition/_Acquisition.c 2009-01-21 16:25:34 UTC (rev 94906) +++ Zope/branches/2.10/lib/python/Acquisition/_Acquisition.c 2009-01-21 16:26:38 UTC (rev 94907) @@ -38,7 +38,8 @@ *py__long__, *py__float__, *py__oct__, *py__hex__, *py__getitem__, *py__setitem__, *py__delitem__, *py__getslice__, *py__setslice__, *py__delslice__, *py__contains__, - *py__len__, *py__of__, *py__call__, *py__repr__, *py__str__, *py__cmp__; + *py__len__, *py__of__, *py__call__, *py__repr__, *py__str__, *py__cmp__, + *py__iter__;
static PyObject *Acquired=0;
@@ -82,7 +83,8 @@ INIT_PY_NAME(__repr__); INIT_PY_NAME(__str__); INIT_PY_NAME(__cmp__); - + INIT_PY_NAME(__iter__); + #undef INIT_PY_NAME }
@@ -817,6 +819,12 @@ return c; }
+static PyObject * +Wrapper_iter(Wrapper *self) +{ + return CallMethodO(OBJECT(self), py__iter__, NULL, NULL); +} + static PySequenceMethods Wrapper_as_sequence = { (inquiry)Wrapper_length, /*sq_length*/ (binaryfunc)Wrapper_add, /*sq_concat*/ @@ -1222,7 +1230,7 @@ /* tp_clear */ (inquiry)Wrapper_clear, /* tp_richcompare */ (richcmpfunc)0, /* tp_weaklistoffset */ (long)0, - /* tp_iter */ (getiterfunc)0, + (getiterfunc)Wrapper_iter, /*tp_iter*/ /* tp_iternext */ (iternextfunc)0, /* tp_methods */ Wrapper_methods, /* tp_members */ 0, @@ -1266,7 +1274,7 @@ /* tp_clear */ (inquiry)Wrapper_clear, /* tp_richcompare */ (richcmpfunc)0, /* tp_weaklistoffset */ (long)0, - /* tp_iter */ (getiterfunc)0, + (getiterfunc)Wrapper_iter, /*tp_iter*/ /* tp_iternext */ (iternextfunc)0, /* tp_methods */ Wrapper_methods, /* tp_members */ 0,
Modified: Zope/branches/2.10/lib/python/Acquisition/tests.py =================================================================== --- Zope/branches/2.10/lib/python/Acquisition/tests.py 2009-01-21 16:25:34 UTC (rev 94906) +++ Zope/branches/2.10/lib/python/Acquisition/tests.py 2009-01-21 16:26:38 UTC (rev 94907) @@ -1636,6 +1636,9 @@ ... def __contains__(self, key): ... print 'contains', repr(key) ... return key == 5 + ... def __iter__(self): + ... print 'iterating...' + ... return iter((42,))
The naked class behaves like this:
@@ -1646,6 +1649,9 @@ >>> 5 in c contains 5 True + >>> list(c) + iterating... + [42]
Let's put c in the context of i:
@@ -1660,7 +1666,59 @@ >>> 5 in i.c contains 5 True + >>> list(i.c) + iterating... + [42]
+ Let's let's test the same again with an explicit wrapper: + + >>> import Acquisition + >>> class Impl(Acquisition.Explicit): + ... pass + + >>> class C(Acquisition.Explicit): + ... def __getitem__(self, key): + ... print 'getitem', key + ... if key == 4: + ... raise IndexError + ... return key + ... def __contains__(self, key): + ... print 'contains', repr(key) + ... return key == 5 + ... def __iter__(self): + ... print 'iterating...' + ... return iter((42,)) + + The naked class behaves like this: + + >>> c = C() + >>> 3 in c + contains 3 + False + >>> 5 in c + contains 5 + True + >>> list(c) + iterating... + [42] + + Let's put c in the context of i: + + >>> i = Impl() + >>> i.c = c + + Now check that __contains__ is properly used: + + >>> 3 in i.c # c.__of__(i) + contains 3 + False + >>> 5 in i.c + contains 5 + True + >>> list(i.c) + iterating... + [42] + """
This doctest is failing for me in an up-to-date checkout of the 2.10 branch. Andreas, can you please investigate? - ---------------------------------------------------------------------- File "/home/tseaver/projects/Zope-CVS/Zope-2.10-branch/lib/python/Acquisition/tests.py", line 1669, in Acquisition.tests.test_proxying Failed example: list(i.c) Expected: iterating... [42] Got: getitem 0 getitem 1 getitem 2 getitem 3 getitem 4 [0, 1, 2, 3] - ---------------------------------------------------------------------- File "/home/tseaver/projects/Zope-CVS/Zope-2.10-branch/lib/python/Acquisition/tests.py", line 1718, in Acquisition.tests.test_proxying Failed example: list(i.c) Expected: iterating... [42] Got: getitem 0 getitem 1 getitem 2 getitem 3 getitem 4 [0, 1, 2, 3] Tres. - -- =================================================================== Tres Seaver +1 540-429-0999 tseaver@palladion.com Palladion Software "Excellence by Design" http://palladion.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFKMUim+gerLs4ltQ4RAou8AKCFvW9TP1XhJkPU78AU2UTLgjmfZgCg2/xL k/F2tz/DBiHAoEjZ1zaXIXo= =pzv1 -----END PGP SIGNATURE-----