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