[Checkins] SVN: Acquisition/branches/erp5-aq_dynamic/ resync with trunk
Leonardo Rochael Almeida
leorochael at gmail.com
Thu Mar 3 09:23:43 EST 2011
Log message for revision 120735:
resync with trunk
Changed:
U Acquisition/branches/erp5-aq_dynamic/CHANGES.txt
U Acquisition/branches/erp5-aq_dynamic/setup.py
U Acquisition/branches/erp5-aq_dynamic/src/Acquisition/README.txt
U Acquisition/branches/erp5-aq_dynamic/src/Acquisition/_Acquisition.c
U Acquisition/branches/erp5-aq_dynamic/src/Acquisition/interfaces.py
U Acquisition/branches/erp5-aq_dynamic/src/Acquisition/tests.py
-=-
Modified: Acquisition/branches/erp5-aq_dynamic/CHANGES.txt
===================================================================
--- Acquisition/branches/erp5-aq_dynamic/CHANGES.txt 2011-03-03 14:18:42 UTC (rev 120734)
+++ Acquisition/branches/erp5-aq_dynamic/CHANGES.txt 2011-03-03 14:23:43 UTC (rev 120735)
@@ -1,10 +1,24 @@
Changelog
=========
-2.13.6 (unreleased)
+2.13.8 (unreleased)
-------------------
+2.13.7 (2011-03-02)
+-------------------
+
+- Fixed bug: When an object did not implement ``__unicode__``, calling
+ ``unicode(wrapped)`` was calling ``__str__`` with an unwrapped ``self``.
+
+2.13.6 (2011-02-19)
+-------------------
+
+- Add ``aq_explicit`` to ``IAcquisitionWrapper``.
+
+- Fixed bug: ``unicode(wrapped)`` was not calling a ``__unicode__``
+ method on wrapped objects.
+
2.13.5 (2010-09-29)
-------------------
Modified: Acquisition/branches/erp5-aq_dynamic/setup.py
===================================================================
--- Acquisition/branches/erp5-aq_dynamic/setup.py 2011-03-03 14:18:42 UTC (rev 120734)
+++ Acquisition/branches/erp5-aq_dynamic/setup.py 2011-03-03 14:23:43 UTC (rev 120735)
@@ -17,7 +17,7 @@
from setuptools import setup, find_packages, Extension
setup(name='Acquisition',
- version = '2.13.6dev',
+ version = '2.13.8dev',
url='http://pypi.python.org/pypi/Acquisition',
license='ZPL 2.1',
description="Acquisition is a mechanism that allows objects to obtain "
Modified: Acquisition/branches/erp5-aq_dynamic/src/Acquisition/README.txt
===================================================================
--- Acquisition/branches/erp5-aq_dynamic/src/Acquisition/README.txt 2011-03-03 14:18:42 UTC (rev 120734)
+++ Acquisition/branches/erp5-aq_dynamic/src/Acquisition/README.txt 2011-03-03 14:23:43 UTC (rev 120735)
@@ -118,7 +118,7 @@
Sometimes, you want to dynamically make an implicitly acquiring object
acquire explicitly. You can do this by getting the object's
aq_explicit attribute. This attribute provides the object with an
-explicit wrapper that places the original implicit wrapper.
+explicit wrapper that replaces the original implicit wrapper.
Filtered Acquisition
====================
Modified: Acquisition/branches/erp5-aq_dynamic/src/Acquisition/_Acquisition.c
===================================================================
--- Acquisition/branches/erp5-aq_dynamic/src/Acquisition/_Acquisition.c 2011-03-03 14:18:42 UTC (rev 120734)
+++ Acquisition/branches/erp5-aq_dynamic/src/Acquisition/_Acquisition.c 2011-03-03 14:23:43 UTC (rev 120735)
@@ -51,8 +51,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__parent__, *py__iter__;
+ *py__len__, *py__of__, *py__call__, *py__repr__, *py__str__, *py__unicode__,
+ *py__cmp__, *py__parent__, *py__iter__;
static PyObject *Acquired=0;
@@ -95,6 +95,7 @@
INIT_PY_NAME(__call__);
INIT_PY_NAME(__repr__);
INIT_PY_NAME(__str__);
+ INIT_PY_NAME(__unicode__);
INIT_PY_NAME(__cmp__);
INIT_PY_NAME(__parent__);
INIT_PY_NAME(__iter__);
@@ -897,6 +898,23 @@
}
}
+static PyObject *
+Wrapper_unicode(Wrapper *self)
+{
+ PyObject *r;
+
+ if ((r=PyObject_GetAttr(OBJECT(self),py__unicode__)))
+ {
+ ASSIGN(r,PyObject_CallFunction(r,NULL,NULL));
+ return r;
+ }
+ else
+ {
+ PyErr_Clear();
+ return Wrapper_str(self);
+ }
+}
+
static long
Wrapper_hash(Wrapper *self)
{
@@ -1371,6 +1389,8 @@
"Wrappers are not picklable"},
{"__reduce_ex__", (PyCFunction)Wrappers_are_not_picklable, METH_VARARGS,
"Wrappers are not picklable"},
+ {"__unicode__", (PyCFunction)Wrapper_unicode, METH_NOARGS,
+ "Unicode"},
{NULL, NULL} /* sentinel */
};
Modified: Acquisition/branches/erp5-aq_dynamic/src/Acquisition/interfaces.py
===================================================================
--- Acquisition/branches/erp5-aq_dynamic/src/Acquisition/interfaces.py 2011-03-03 14:18:42 UTC (rev 120734)
+++ Acquisition/branches/erp5-aq_dynamic/src/Acquisition/interfaces.py 2011-03-03 14:23:43 UTC (rev 120735)
@@ -62,3 +62,7 @@
aq_chain = Attribute(
"""Get a list of objects in the acquisition environment."""
)
+
+ aq_explicit = Attribute(
+ """Get the object with an explicit acquisition wrapper."""
+ )
Modified: Acquisition/branches/erp5-aq_dynamic/src/Acquisition/tests.py
===================================================================
--- Acquisition/branches/erp5-aq_dynamic/src/Acquisition/tests.py 2011-03-03 14:18:42 UTC (rev 120734)
+++ Acquisition/branches/erp5-aq_dynamic/src/Acquisition/tests.py 2011-03-03 14:23:43 UTC (rev 120735)
@@ -2397,53 +2397,132 @@
Traceback (most recent call last):
...
AttributeError: non_existant_attr
-
"""
-def test___parent__parent__circles():
- """
- Acquisition won't follow circular __parent__ references:
- >>> class Impl(Acquisition.Implicit):
- ... hello = 'world'
+import unittest
+from doctest import DocTestSuite, DocFileSuite
- >>> class Impl2(Acquisition.Implicit):
- ... hello = 'world2'
- ... only = 'here'
- >>> x = Impl()
- >>> y = Impl2()
- >>> x.__parent__ = y
- >>> y.__parent__ = x
+class TestParent(unittest.TestCase):
- >>> x.__parent__.__parent__ is x
- True
+ def test_parent_parent_circles(self):
+ class Impl(Acquisition.Implicit):
+ hello = 'world'
+ class Impl2(Acquisition.Implicit):
+ hello = 'world2'
+ only = 'here'
- >>> Acquisition.aq_acquire(x, 'hello')
- 'world'
- >>> Acquisition.aq_acquire(x, 'only')
- 'here'
+ x = Impl()
+ y = Impl2()
+ x.__parent__ = y
+ y.__parent__ = x
- >>> Acquisition.aq_acquire(x, 'non_existant_attr')
- Traceback (most recent call last):
- ...
- AttributeError: non_existant_attr
+ self.assertTrue(x.__parent__.__parent__ is x)
+ self.assertEqual(Acquisition.aq_acquire(x, 'hello'), 'world')
+ self.assertEqual(Acquisition.aq_acquire(x, 'only'), 'here')
- >>> Acquisition.aq_acquire(y, 'non_existant_attr')
- Traceback (most recent call last):
- ...
- AttributeError: non_existant_attr
- """
+ self.assertRaises(AttributeError, Acquisition.aq_acquire,
+ x, 'non_existant_attr')
+ self.assertRaises(AttributeError, Acquisition.aq_acquire,
+ y, 'non_existant_attr')
-import unittest
-from doctest import DocTestSuite, DocFileSuite
+ def test_parent_parent_parent_circles(self):
+ class Impl(Acquisition.Implicit):
+ hello = 'world'
+ class Impl2(Acquisition.Implicit):
+ hello = 'world'
+ class Impl3(Acquisition.Implicit):
+ hello = 'world2'
+ only = 'here'
+ a = Impl()
+ b = Impl2()
+ c = Impl3()
+ a.__parent__ = b
+ b.__parent__ = c
+ c.__parent__ = a
+
+ # This is not quite what you'd expect, an AQ circle with an
+ # intermediate object gives strange results
+ self.assertTrue(a.__parent__.__parent__ is a)
+ self.assertTrue(a.__parent__.__parent__.__parent__.aq_base is b)
+ self.assertTrue(b.__parent__.__parent__ is b)
+ self.assertTrue(c.__parent__.__parent__ is c)
+
+ self.assertEqual(Acquisition.aq_acquire(a, 'hello'), 'world')
+ self.assertEqual(Acquisition.aq_acquire(b, 'hello'), 'world')
+ self.assertEqual(Acquisition.aq_acquire(c, 'hello'), 'world2')
+
+ self.assertRaises(AttributeError, Acquisition.aq_acquire,
+ a, 'only')
+ self.assertEqual(Acquisition.aq_acquire(b, 'only'), 'here')
+ self.assertEqual(Acquisition.aq_acquire(c, 'only'), 'here')
+
+ self.assertRaises(AttributeError, Acquisition.aq_acquire,
+ a, 'non_existant_attr')
+ self.assertRaises(AttributeError, Acquisition.aq_acquire,
+ b, 'non_existant_attr')
+ self.assertRaises(AttributeError, Acquisition.aq_acquire,
+ c, 'non_existant_attr')
+
+
+class TestUnicode(unittest.TestCase):
+
+ def test_implicit_aq_unicode_should_be_called(self):
+ class A(Acquisition.Implicit):
+ def __unicode__(self):
+ return u'unicode was called'
+ wrapped = A().__of__(A())
+ self.assertEqual(u'unicode was called', unicode(wrapped))
+ self.assertEqual(str(wrapped), repr(wrapped))
+
+ def test_explicit_aq_unicode_should_be_called(self):
+ class A(Acquisition.Explicit):
+ def __unicode__(self):
+ return u'unicode was called'
+ wrapped = A().__of__(A())
+ self.assertEqual(u'unicode was called', unicode(wrapped))
+ self.assertEqual(str(wrapped), repr(wrapped))
+
+ def test_implicit_should_fall_back_to_str(self):
+ class A(Acquisition.Implicit):
+ def __str__(self):
+ return 'str was called'
+ wrapped = A().__of__(A())
+ self.assertEqual(u'str was called', unicode(wrapped))
+ self.assertEqual('str was called', str(wrapped))
+
+ def test_explicit_should_fall_back_to_str(self):
+ class A(Acquisition.Explicit):
+ def __str__(self):
+ return 'str was called'
+ wrapped = A().__of__(A())
+ self.assertEqual(u'str was called', unicode(wrapped))
+ self.assertEqual('str was called', str(wrapped))
+
+ def test_str_fallback_should_be_called_with_wrapped_self(self):
+ class A(Acquisition.Implicit):
+ def __str__(self):
+ return str(self.aq_parent == outer)
+ outer = A()
+ inner = A().__of__(outer)
+ self.assertEqual(u'True', unicode(inner))
+
+ def test_unicode_should_be_called_with_wrapped_self(self):
+ class A(Acquisition.Implicit):
+ def __unicode__(self):
+ return str(self.aq_parent == outer)
+ outer = A()
+ inner = A().__of__(outer)
+ self.assertEqual(u'True', unicode(inner))
+
+
def test_suite():
return unittest.TestSuite((
DocTestSuite(),
DocTestSuite('Acquisition.test_dynamic_acquisition'),
DocFileSuite('README.txt', package='Acquisition'),
+ unittest.makeSuite(TestParent),
+ unittest.makeSuite(TestUnicode),
))
-
-if __name__ == '__main__':
- unittest.main(defaultTest='test_suite')
More information about the checkins
mailing list