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

Reply via email to