[Zope-Checkins] SVN: Zope/branches/2.10/ Acquisition wrappers now correctly proxy __contains__.

Florent Guillaume fg at nuxeo.com
Fri Jun 2 10:24:46 EDT 2006


Log message for revision 68458:
  Acquisition wrappers now correctly proxy __contains__.
  
  

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	2006-06-02 11:03:06 UTC (rev 68457)
+++ Zope/branches/2.10/doc/CHANGES.txt	2006-06-02 14:24:46 UTC (rev 68458)
@@ -14,6 +14,12 @@
      to the rules for such a type laid out in the Python docs:
      http://docs.python.org/api/supporting-cycle-detection.html
 
+  After Zope 2.10 beta 1
+
+    Bugs Fixed
+
+      - Acquisition wrappers now correctly proxy __contains__.
+
   Zope 2.10 beta 1 (2006/05/30)
 
     Restructuring

Modified: Zope/branches/2.10/lib/python/Acquisition/_Acquisition.c
===================================================================
--- Zope/branches/2.10/lib/python/Acquisition/_Acquisition.c	2006-06-02 11:03:06 UTC (rev 68457)
+++ Zope/branches/2.10/lib/python/Acquisition/_Acquisition.c	2006-06-02 14:24:46 UTC (rev 68458)
@@ -37,7 +37,7 @@
   *py__pos__, *py__abs__, *py__nonzero__, *py__invert__, *py__int__,
   *py__long__, *py__float__, *py__oct__, *py__hex__,
   *py__getitem__, *py__setitem__, *py__delitem__,
-  *py__getslice__, *py__setslice__, *py__delslice__,
+  *py__getslice__, *py__setslice__, *py__delslice__,  *py__contains__,
   *py__len__, *py__of__, *py__call__, *py__repr__, *py__str__, *py__cmp__;
 
 static PyObject *Acquired=0;
@@ -75,6 +75,7 @@
   INIT_PY_NAME(__getslice__);
   INIT_PY_NAME(__setslice__);
   INIT_PY_NAME(__delslice__);
+  INIT_PY_NAME(__contains__);
   INIT_PY_NAME(__len__);
   INIT_PY_NAME(__of__);
   INIT_PY_NAME(__call__);
@@ -804,6 +805,18 @@
   return 0;
 }
 
+static int
+Wrapper_contains(Wrapper *self, PyObject *v)
+{
+  long c;
+
+  UNLESS(v=CallMethodO(OBJECT(self),py__contains__,Build("(O)", v) ,NULL))
+    return -1;
+  c = PyInt_AsLong(v);
+  Py_DECREF(v);
+  return c;
+}
+
 static PySequenceMethods Wrapper_as_sequence = {
 	(inquiry)Wrapper_length,		/*sq_length*/
 	(binaryfunc)Wrapper_add,		/*sq_concat*/
@@ -812,6 +825,7 @@
 	(intintargfunc)Wrapper_slice,		/*sq_slice*/
 	(intobjargproc)Wrapper_ass_item,	/*sq_ass_item*/
 	(intintobjargproc)Wrapper_ass_slice,	/*sq_ass_slice*/
+	(objobjproc)Wrapper_contains,		/*sq_contains*/
 };
 
 /* -------------------------------------------------------------- */

Modified: Zope/branches/2.10/lib/python/Acquisition/tests.py
===================================================================
--- Zope/branches/2.10/lib/python/Acquisition/tests.py	2006-06-02 11:03:06 UTC (rev 68457)
+++ Zope/branches/2.10/lib/python/Acquisition/tests.py	2006-06-02 14:24:46 UTC (rev 68458)
@@ -1620,8 +1620,50 @@
 """
 
 
-    
+def test_proxying():
+    """Make sure that recent python slots are proxied.
 
+    >>> import Acquisition
+    >>> class Impl(Acquisition.Implicit):
+    ...     pass
+
+    >>> class C(Acquisition.Implicit):
+    ...     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
+
+    The naked class behaves like this:
+
+    >>> c = C()
+    >>> 3 in c
+    contains 3
+    False
+    >>> 5 in c
+    contains 5
+    True
+
+    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
+
+    """
+
+
 import unittest
 from zope.testing.doctest import DocTestSuite
 



More information about the Zope-Checkins mailing list