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
[email protected]
https://lists.sourceforge.net/lists/listinfo/rpy-list