From eea34ca17d2394be633658c5bd2807b05807da04 Mon Sep 17 00:00:00 2001 From: Graham Dumpleton Date: Mon, 12 Aug 2013 22:08:39 +0800 Subject: [PATCH] Add support for __dir__ proxying in ObjectProxy. --- src/_wrappers.c | 19 ++++++++++++++- tests/test_object_proxy.py | 50 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/_wrappers.c b/src/_wrappers.c index 92abc08..d4ef1f9 100644 --- a/src/_wrappers.c +++ b/src/_wrappers.c @@ -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*/ diff --git a/tests/test_object_proxy.py b/tests/test_object_proxy.py index f59ee78..dbb08d8 100644 --- a/tests/test_object_proxy.py +++ b/tests/test_object_proxy.py @@ -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()