Revision: 625
http://rpy.svn.sourceforge.net/rpy/?rev=625&view=rev
Author: lgautier
Date: 2008-08-09 18:50:36 + (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.c2008-08-09 18:08:45 UTC
(rev 624)
+++ branches/rpy_nextgen/rpy/rinterface/rinterface.c2008-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
=