Revision: 463 http://rpy.svn.sourceforge.net/rpy/?rev=463&view=rev Author: lgautier Date: 2008-03-23 15:08:42 -0700 (Sun, 23 Mar 2008)
Log Message: ----------- Implemented "len()" for SexpEnvironment Modified Paths: -------------- branches/rpy_nextgen/rpy/rinterface/rinterface.c branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py Modified: branches/rpy_nextgen/rpy/rinterface/rinterface.c =================================================================== --- branches/rpy_nextgen/rpy/rinterface/rinterface.c 2008-03-23 22:03:51 UTC (rev 462) +++ branches/rpy_nextgen/rpy/rinterface/rinterface.c 2008-03-23 22:08:42 UTC (rev 463) @@ -168,6 +168,8 @@ globalEnv->sexp = R_GlobalEnv; + baseNameSpaceEnv->sexp = R_BaseNamespace; + PyObject *res = PyInt_FromLong(status); return res; @@ -1008,14 +1010,24 @@ return 0; } +static Py_ssize_t EnvironmentSexp_length(PyObject *self) +{ + SEXP rho_R = ((SexpObject *)self)->sexp; + if (! rho_R) { + PyErr_Format(PyExc_ValueError, "The environment has NULL SEXP."); + return -1; + } + SEXP symbols = R_lsInternal(rho_R, TRUE); + Py_ssize_t len = (Py_ssize_t)GET_LENGTH(symbols); + return len; +} + static PyMappingMethods EnvironmentSexp_mappignMethods = { - 0, /* mp_length */ + (lenfunc)EnvironmentSexp_length, /* mp_length */ (binaryfunc)EnvironmentSexp_subscript, /* mp_subscript */ (objobjargproc)EnvironmentSexp_ass_subscript /* mp_ass_subscript */ }; -//FIXME: write more doc - should the environments -// be made like mappings at the Python level ? PyDoc_STRVAR(EnvironmentSexp_Type_doc, "R object that is an environment.\ R environments can be seen as similar to Python\ Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py =================================================================== --- branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py 2008-03-23 22:03:51 UTC (rev 462) +++ branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py 2008-03-23 22:08:42 UTC (rev 463) @@ -45,6 +45,15 @@ a = rinterface.globalEnv["a"] self.assertTrue(False) #FIXME: write proper unit test here + def testLength(self): + newEnv = rinterface.globalEnv.get("new.env") + env = newEnv() + self.assertEquals(0, len(env)) + env["a"] = rinterface.SexpVector([123, ], rinterface.INTSXP) + self.assertEquals(1, len(env)) + env["b"] = rinterface.SexpVector([123, ], rinterface.INTSXP) + self.assertEquals(2, len(env)) + def suite(): suite = unittest.TestLoader().loadTestsFromTestCase(SexpEnvironmentTestCase) return suite This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ rpy-list mailing list rpy-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rpy-list