Add support for __dir__ proxying in ObjectProxy.

This commit is contained in:
Graham Dumpleton
2013-08-12 22:08:39 +08:00
parent f5e0cc3753
commit eea34ca17d
2 changed files with 68 additions and 1 deletions

View File

@@ -190,6 +190,19 @@ static void WraptObjectProxy_dealloc(WraptObjectProxyObject *self)
/* ------------------------------------------------------------------------- */
static PyObject *WraptObjectProxy_dir(
WraptObjectProxyObject *self, PyObject *args)
{
if (!self->wrapped) {
PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised");
return NULL;
}
return PyObject_Dir(self->wrapped);
}
/* ------------------------------------------------------------------------- */
static PyObject *WraptObjectProxy_get_wrapped(
WraptObjectProxyObject *self, void *closure)
{
@@ -393,6 +406,10 @@ static PyObject *WraptObjectProxy_iter(WraptObjectProxyObject *self)
/* ------------------------------------------------------------------------- */
static PyMethodDef WraptObjectProxy_methods[] = {
{ "__dir__", (PyCFunction)WraptObjectProxy_dir, METH_NOARGS, 0 },
};
static PyGetSetDef WraptObjectProxy_getset[] = {
{ "_self_wrapped", (getter)WraptObjectProxy_get_wrapped,
NULL, 0 },
@@ -439,7 +456,7 @@ PyTypeObject WraptObjectProxy_Type = {
0, /*tp_weaklistoffset*/
(getiterfunc)WraptObjectProxy_iter, /*tp_iter*/
0, /*tp_iternext*/
0, /*tp_methods*/
WraptObjectProxy_methods, /*tp_methods*/
0, /*tp_members*/
WraptObjectProxy_getset, /*tp_getset*/
0, /*tp_base*/

View File

@@ -140,5 +140,55 @@ class TestTypeObjectProxy(unittest.TestCase):
self.assertEqual(wrapper.__class__, target.__class__)
self.assertTrue(isinstance(wrapper, type(target)))
class TestDirObjectProxy(unittest.TestCase):
def test_dir_of_class(self):
# Test preservation of class __dir__ attribute.
target = objects.Target
wrapper = wrapt.ObjectProxy(target)
self.assertEqual(dir(wrapper), dir(target))
def test_vars_of_class(self):
# Test preservation of class __dir__ attribute.
target = objects.Target
wrapper = wrapt.ObjectProxy(target)
self.assertEqual(vars(wrapper), vars(target))
def test_dir_of_instance(self):
# Test preservation of instance __dir__ attribute.
target = objects.Target()
wrapper = wrapt.ObjectProxy(target)
self.assertEqual(dir(wrapper), dir(target))
def test_vars_of_instance(self):
# Test preservation of instance __dir__ attribute.
target = objects.Target()
wrapper = wrapt.ObjectProxy(target)
self.assertEqual(vars(wrapper), vars(target))
def test_dir_of_function(self):
# Test preservation of function __dir__ attribute.
target = objects.target
wrapper = wrapt.ObjectProxy(target)
self.assertEqual(dir(wrapper), dir(target))
def test_vars_of_function(self):
# Test preservation of function __dir__ attribute.
target = objects.target
wrapper = wrapt.ObjectProxy(target)
self.assertEqual(vars(wrapper), vars(target))
if __name__ == '__main__':
unittest.main()