Revision: 625
          http://rpy.svn.sourceforge.net/rpy/?rev=625&view=rev
Author:   lgautier
Date:     2008-08-09 18:50:36 +0000 (Sat, 09 Aug 2008)

Log Message:
-----------
- R string vectors can now be built from Python unicode objects
- fixed tests (ending-reinitializing R causes trouble)

Modified Paths:
--------------
    branches/rpy_nextgen/NEWS
    branches/rpy_nextgen/rpy/rinterface/rinterface.c
    branches/rpy_nextgen/rpy/rinterface/tests/test_EmbeddedR.py
    branches/rpy_nextgen/rpy/rinterface/tests/test_SexpClosure.py
    branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVector.py

Modified: branches/rpy_nextgen/NEWS
===================================================================
--- branches/rpy_nextgen/NEWS   2008-08-09 18:08:45 UTC (rev 624)
+++ branches/rpy_nextgen/NEWS   2008-08-09 18:50:36 UTC (rev 625)
@@ -8,6 +8,9 @@
 
 - :func:`setReadConsole`: specify Python callback for console input
 
+- R string vectors can now be built from Python unicode objects
+
+
 Changes
 -------
 
@@ -28,7 +31,9 @@
 
 - Handling of negative indexes for :class:`SexpVector`'s :meth:`__getitem__` 
and :meth:`__setitem__` was missing
 
+- Trying to create an instance of :class:`SexpVector` before initializing R 
raises a RuntimeException (used to segfault)
 
+
 Release 2.0.0a2
 ===============
 

Modified: branches/rpy_nextgen/rpy/rinterface/rinterface.c
===================================================================
--- branches/rpy_nextgen/rpy/rinterface/rinterface.c    2008-08-09 18:08:45 UTC 
(rev 624)
+++ branches/rpy_nextgen/rpy/rinterface/rinterface.c    2008-08-09 18:50:36 UTC 
(rev 625)
@@ -2013,6 +2013,7 @@
 newSEXP(PyObject *object, int rType)
 {
   SEXP sexp;
+  SEXP str_R; /* used whenever there a string / unicode */
   PyObject *seq_object, *item; 
 
 #ifdef RPY_VERBOSE
@@ -2071,7 +2072,7 @@
   case STRSXP:
     for (i = 0; i < length; ++i) {
       if((item = PyObject_Str(PySequence_Fast_GET_ITEM(seq_object, i)))) {
-       SEXP str_R = mkChar(PyString_AS_STRING(item));
+       str_R = mkChar(PyString_AS_STRING(item));
        if (!str_R) {
          Py_DECREF(item);
          PyErr_NoMemory();
@@ -2081,6 +2082,17 @@
        Py_DECREF(item);
        SET_STRING_ELT(sexp, i, str_R);
       }
+      else if ((item = PyObject_Unicode(PySequence_Fast_GET_ITEM(seq_object, 
i)))) {
+       str_R = mkChar(PyUnicode_AS_DATA(item));
+       if (!str_R) {
+         Py_DECREF(item);
+         PyErr_NoMemory();
+         sexp = NULL;
+         break;
+       }
+       Py_DECREF(item);
+       SET_STRING_ELT(sexp, i, str_R);
+      }
       else {
        PyErr_Clear();
        SET_STRING_ELT(sexp, i, NA_STRING);

Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_EmbeddedR.py
===================================================================
--- branches/rpy_nextgen/rpy/rinterface/tests/test_EmbeddedR.py 2008-08-09 
18:08:45 UTC (rev 624)
+++ branches/rpy_nextgen/rpy/rinterface/tests/test_EmbeddedR.py 2008-08-09 
18:50:36 UTC (rev 625)
@@ -24,7 +24,9 @@
         self.assertEquals(yes.strip(), res[0])
         rinterface.setReadConsole(rinterface.consoleRead)
 
+#FIXME: end and initializing again causes currently a lot a trouble...
     def testCallErrorWhenEndedR(self):
+        self.assertTrue(False) # worked when tested, but calling endEmbeddedR 
causes trouble
         t = rinterface.baseNameSpaceEnv['date']
         rinterface.endEmbeddedR(1)
         self.assertRaises(RuntimeError, t)

Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_SexpClosure.py
===================================================================
--- branches/rpy_nextgen/rpy/rinterface/tests/test_SexpClosure.py       
2008-08-09 18:08:45 UTC (rev 624)
+++ branches/rpy_nextgen/rpy/rinterface/tests/test_SexpClosure.py       
2008-08-09 18:50:36 UTC (rev 625)
@@ -54,11 +54,15 @@
 
 
 
-    def testRcall(self):
-        ad = rlc.ArgsDict((('a', rinterface.SexpVector([2, ], 
rinterface.INTSXP)), 
-                           ('b', rinterface.SexpVector([1, ], 
rinterface.INTSXP)),
-                           (None, rinterface.SexpVector([5, ], 
rinterface.INTSXP)),
-                           ('c', rinterface.SexpVector([0, ], 
rinterface.INTSXP))))
+    def testRcallArgsDict(self):
+        ad = rlc.ArgsDict((('a', rinterface.SexpVector([2, ], 
+                                                       rinterface.INTSXP)), 
+                           ('b', rinterface.SexpVector([1, ], 
+                                                       rinterface.INTSXP)),
+                           (None, rinterface.SexpVector([5, ], 
+                                                        rinterface.INTSXP)),
+                           ('c', rinterface.SexpVector([0, ], 
+                                                       rinterface.INTSXP))))
         
         mylist = rinterface.baseNameSpaceEnv['list'].rcall(ad.items())
         

Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVector.py
===================================================================
--- branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVector.py        
2008-08-09 18:08:45 UTC (rev 624)
+++ branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVector.py        
2008-08-09 18:50:36 UTC (rev 625)
@@ -17,6 +17,14 @@
     def testMissinfType(self):
         self.assertRaises(ValueError, ri.SexpVector, [2, ])
 
+#FIXME: end and initializing again causes currently a lot a trouble...
+    def testNewWithoutInit(self):
+        self.assertTrue(False) # worked when tested, but calling endEmbeddedR 
causes trouble
+        ri.endEmbeddedR(1)
+        self.assertRaises(RuntimeError, ri.SexpVector, [1,2], ri.INTSXP)
+        #FIXME: trouble... does not initialize R when failing the test
+        ri.initEmbeddedR()
+
     def testNewBool(self):
         sexp = ri.SexpVector([True, ], ri.LGLSXP)
         isLogical = ri.globalEnv.get("is.logical")
@@ -71,6 +79,14 @@
 
         ri.NA_STRING[0]
 
+    def testNewUnicode(self):
+        sexp = ri.SexpVector([u'abc', ], ri.STRSXP)
+        isCharacter = ri.globalEnv.get("is.character")
+        ok = isCharacter(sexp)[0]
+        self.assertTrue(ok)
+        self.assertEquals('abc', sexp[0])
+
+
     def testNewVector(self):
         sexp_char = ri.SexpVector(["abc", ], 
                                           ri.STRSXP)


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 the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
rpy-list mailing list
rpy-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rpy-list

Reply via email to