Revision: 363
          http://rpy.svn.sourceforge.net/rpy/?rev=363&view=rev
Author:   warnes
Date:     2007-11-12 15:27:48 -0800 (Mon, 12 Nov 2007)

Log Message:
-----------

- Add three new exceptions: 
    RPyException                Base exception class for all RPy Exceptions
    RPyTypeConversionException  Error in conversion between R and Python
    RPyRException               Error raised within R

    (RException is set equal to RPyException for backwards compatibility)

- Properly handle all Numeric/NumPy array types

- Solve 64 bit problems converting Numeric/NumPy arrays

Modified Paths:
--------------
    trunk/rpy/TODO
    trunk/rpy/rpy.py
    trunk/rpy/setup.py
    trunk/rpy/src/RPy.h
    trunk/rpy/src/R_eval.c
    trunk/rpy/src/rpymodule.c
    trunk/rpy/tests/test_array.py
    trunk/rpy/tests/test_numeric.py
    trunk/rpy/tests/test_robj.py
    trunk/rpy/tests/test_tor.py
    trunk/rpy/tests/test_util.py

Modified: trunk/rpy/TODO
===================================================================
--- trunk/rpy/TODO      2007-11-06 16:49:53 UTC (rev 362)
+++ trunk/rpy/TODO      2007-11-12 23:27:48 UTC (rev 363)
@@ -1,6 +1,10 @@
 
 C=Critical, I=Important, U=Useful, O=Optional
 
+I* Update install instructions to include information about use of 'RHOMES'
+
+I* Ensure that either Numarray, Numeric, or NumPy can be used
+
 C* Properly clean up R when python exits, even if the user hasn't called 'q()'
 
 U* Posibility to pass Python functions to R functions

Modified: trunk/rpy/rpy.py
===================================================================
--- trunk/rpy/rpy.py    2007-11-06 16:49:53 UTC (rev 362)
+++ trunk/rpy/rpy.py    2007-11-12 23:27:48 UTC (rev 363)
@@ -169,9 +169,21 @@
 def get_default_mode():
     return _rpy.get_mode()
 
-# The new exception
-RException = _rpy.RException
+# Three new exceptions
+# base exception
+RPyException = _rpy.RPy_Exception;
 
+# R <-> Python conversion exception
+RPyTypeConversionException = _rpy.RPy_TypeConversionException;
+
+# Exception raised by R
+RPyRException = _rpy.RPy_RException
+
+# for backwards compatibility
+RException = RPyException
+
+
+
 # I/O setters
 set_rpy_output = _rpy.set_output
 set_rpy_input = _rpy.set_input

Modified: trunk/rpy/setup.py
===================================================================
--- trunk/rpy/setup.py  2007-11-06 16:49:53 UTC (rev 362)
+++ trunk/rpy/setup.py  2007-11-12 23:27:48 UTC (rev 363)
@@ -30,6 +30,8 @@
 See the files INSTALL.UNIX and INSTALL.WINDOWS for more details.
 """
 
+DEBUG=True
+
 import os, os.path, sys, shutil
 from distutils.core import setup, Extension
 from distutils.sysconfig import *
@@ -48,6 +50,7 @@
     RHOMES = []
 
 print "RHOMES=", RHOMES
+print "DEBUG=", DEBUG
 
 if not RHOMES:
     if sys.platform=="win32":
@@ -65,8 +68,12 @@
    
     RHOME = RHOME.strip()
 
-    # to avoid strict prototypes errors from R includes
-    get_config_vars()['OPT'] = '-DNDEBUG -g -O3 -Wall'
+    if DEBUG:
+        # to avoid strict prototypes errors from R includes
+        get_config_vars()['OPT'] = '-g -Wall'
+    else:
+        # to avoid strict prototypes errors from R includes
+        get_config_vars()['OPT'] = '-DNDEBUG -g -O3 -Wall'
 
     # get the Python version
     if sys.version[:3] >= '2.2':
@@ -137,12 +144,12 @@
         extra_compile_args=["-shared"]
         source_files = source_files + ["src/setenv.c"]
 
-    # check whether NumPy is present
-    try:
+    # Discover which array packages are present
+    try: 
         import numpy
         DEFINE.append(('WITH_NUMERIC', '3'))
         DEFINE.append(('PY_ARRAY_TYPES_PREFIX', 'PyArray_'))
-        include_dirs.append(numpy.get_numpy_include())
+        include_dirs.append(numpy.get_include())
     except ImportError:
         # fall back to Numeric
         try:
@@ -164,6 +171,9 @@
     DEFINE.append( ('RPY_SHNAME', shlib_name))
     DEFINE.append( ('INIT_RPY', 'init_rpy%s' % RVER ) )
 
+
+    # add debugging 
+
     modules.append( Extension(
         shlib_name,
         source_files,

Modified: trunk/rpy/src/RPy.h
===================================================================
--- trunk/rpy/src/RPy.h 2007-11-06 16:49:53 UTC (rev 362)
+++ trunk/rpy/src/RPy.h 2007-11-12 23:27:48 UTC (rev 363)
@@ -130,10 +130,12 @@
 SEXP do_eval_fun(char *);
 SEXP get_fun_from_name(char *);
 
-/* A new exception */
-extern PyObject *RPyExc_Exception;
+/* Three new exception */
+extern PyObject *RPy_Exception;                /* Base RPy exception  */
+extern PyObject *RPy_TypeConversionException;  /* R<->Python conversion errors 
*/
+extern PyObject *RPy_RException;               /* Errors from R */
 
-char *get_last_error_msg(void);
+const char *get_last_error_msg(void);
 
 /* For initializing R */
 extern int Rf_initEmbeddedR(int argc, char *argv[]);

Modified: trunk/rpy/src/R_eval.c
===================================================================
--- trunk/rpy/src/R_eval.c      2007-11-06 16:49:53 UTC (rev 362)
+++ trunk/rpy/src/R_eval.c      2007-11-12 23:27:48 UTC (rev 363)
@@ -115,7 +115,7 @@
       PyErr_SetNone(PyExc_KeyboardInterrupt);
     }
     else
-      PyErr_SetString(RPyExc_Exception, get_last_error_msg());
+      PyErr_SetString(RPy_RException, get_last_error_msg());
     return NULL;
   }
 
@@ -151,11 +151,11 @@
   /* For R not to throw an error, we must check the identifier is
      neither null nor greater than MAXIDSIZE */
   if (!*ident) {
-    PyErr_SetString(RPyExc_Exception, "attempt to use zero-length variable 
name");
+    PyErr_SetString(RPy_Exception, "attempt to use zero-length variable name");
     return NULL;
   }
   if (strlen(ident) > MAXIDSIZE) {
-    PyErr_SetString(RPyExc_Exception, "symbol print-name too long");
+    PyErr_SetString(RPy_Exception, "symbol print-name too long");
     return NULL;
   }
   
@@ -182,14 +182,14 @@
 #endif
   
   if (obj == R_UnboundValue) {
-    PyErr_Format(RPyExc_Exception, "R Function \"%s\" not found", ident);
+    PyErr_Format(RPy_Exception, "R Function \"%s\" not found", ident);
     return NULL;
   }
   return obj;
 }
 
 /* Obtain the text of the last R error message */
-char *get_last_error_msg() {
+const char *get_last_error_msg() {
   SEXP msg;
 
   msg = do_eval_fun("geterrmessage");

Modified: trunk/rpy/src/rpymodule.c
===================================================================
--- trunk/rpy/src/rpymodule.c   2007-11-06 16:49:53 UTC (rev 362)
+++ trunk/rpy/src/rpymodule.c   2007-11-12 23:27:48 UTC (rev 363)
@@ -47,9 +47,9 @@
 #include <stdlib.h>
 #include <string.h>
 
-/* Flag indicating whether Numeric is available in this session
+/* Flag indicating whether Numpy/Numeric is available in this session
  *
- * This is necessary Numeric may not available at run time, even if
+ * This is necessary since Numpy/Numeric may not available at run time, even if
  * it was available at compile time.
 */
 static int use_numeric=0;
@@ -74,7 +74,9 @@
 static PyObject *proc_table;
 static int default_mode;
 static PyObject *r_lock;
-PyObject *RPyExc_Exception;
+PyObject *RPy_Exception;
+PyObject *RPy_TypeConversionException;
+PyObject *RPy_RException;
 
 static char RHOME[BUFSIZ];
 static char RVERSION[BUFSIZ];
@@ -224,22 +226,32 @@
   PROTECT(robj = NEW_LIST(len));
 
   state = -1;
-  for (i=0; i<len; i++) {
-    if (!(it = PySequence_GetItem(obj, i)))
-      goto exception;
+  for (i=0; i<len; i++) 
+    {
+      it = PySequence_GetItem(obj, i);
+      if (it==NULL)
+       {
+         UNPROTECT(1);
+         return NULL;
+       }
+      
+      if (state < 0)
+       state = type_to_int(it);
+      else
+       state = fsm[state][type_to_int(it)];
+      
+      rit = to_Robj(it);
+      if (rit==NULL || PyErr_Occurred()        )
+       {
+         Py_XDECREF(it);
+         UNPROTECT(1);
+         return NULL;
+       }
+      
+      SET_VECTOR_ELT(robj, i, rit);
+      Py_XDECREF(it);
+    }
 
-    if (state < 0)
-      state = type_to_int(it);
-    else
-      state = fsm[state][type_to_int(it)];
-
-    if (!(rit = to_Robj(it)))
-      goto exception;
-    
-    SET_VECTOR_ELT(robj, i, rit);
-    Py_XDECREF(it);
-  }
-
   switch(state)
     {
     case INT_T:
@@ -263,11 +275,6 @@
   
   UNPROTECT(1);
   return robj;
-
-exception:
-  Py_XDECREF(it);
-  UNPROTECT(1);
-  return NULL;
 }
 
 /* Make a R named list or vector from a Python dictionary */
@@ -287,27 +294,28 @@
     return NULL;
   if (!(values = PyMapping_Values(obj)))
     return NULL;
-  
-  if (!(robj = seq_to_R(values)))
-    goto fail;
-  if (!(names = seq_to_R(keys)))
-    goto fail;
+
+  robj = seq_to_R(values);
+  names = seq_to_R(keys);
+  if ( robj==NULL || robj==NULL )
+    {
+      Py_DECREF(keys);
+      Py_DECREF(values);
+      return NULL;
+    }
+
   PROTECT(robj);
   SET_NAMES(robj, names);
+
   Py_DECREF(keys);
   Py_DECREF(values);
   UNPROTECT(1);
 
   return robj;
-
- fail:
-  Py_DECREF(keys);
-  Py_DECREF(values);
-  return NULL;
 }
 
 #ifdef WITH_NUMERIC
-/* Convert a Numeric array to a R array */
+/* Convert a Numpy/Numeric array to a R array */
 SEXP
 to_Rarray(PyObject *o)
 {
@@ -316,40 +324,146 @@
   SEXP Rdims, tRdims, Rarray, e;
   n_intp *dims;
   int i;
-  long tl;
+  int type;
+  long size;
 
   obj = (PyArrayObject *)o;
   dims = obj->dimensions;
-  tl = 1;
-  PROTECT(Rdims = allocVector(INTSXP, obj->nd));
-  PROTECT(tRdims = allocVector(INTSXP, obj->nd));
-  for (i=0; i<obj->nd; i++) {
-    if (dims[i] == 0) {
+  type = obj->descr->type_num;
+  size = PyArray_Size( (PyObject*) obj);
+
+  /* Handle a vector without dimensions, just length */
+  if(obj->nd==0)
+    {
+      PROTECT(Rdims = allocVector(INTSXP, 1));
+      PROTECT(tRdims = allocVector(INTSXP, 1));
+      INTEGER(Rdims)[0] = size;
+      INTEGER(tRdims)[0] = size;
+    }
+  else
+    {
+      PROTECT(Rdims = allocVector(INTSXP, obj->nd));
+      PROTECT(tRdims = allocVector(INTSXP, obj->nd));
+
+      for (i=0; i<obj->nd; i++) 
+       {
+         if (dims[i] == 0) 
+           {
+             UNPROTECT(2);
+             return R_NilValue;
+           }
+         INTEGER(Rdims)[i] = dims[(obj->nd)-i-1];
+         INTEGER(tRdims)[i] = (obj->nd)-i;
+       }
+    }
+
+    switch(type)
+    {
+
+    /*******************/
+    /* String Variants */
+    /*******************/
+#ifdef PyArray_UNICODE  /* NumPy */
+    case PyArray_UNICODE:
+    case PyArray_STRING:
+    case PyArray_CHAR:
+      obj = (PyArrayObject *)PyArray_ContiguousFromObject((PyObject *)obj,
+                                                         PyArray_STRING, 0, 0);
+#endif
+
+    /******************************************/
+    /* All complex to (double,double) complex  */
+    /******************************************/
+#ifdef PyArray_COMPLEX64
+    case PyArray_COMPLEX64:
+    case PyArray_COMPLEX128:
+#endif
+    case PyArray_CFLOAT:
+    case PyArray_CDOUBLE:
+      obj = (PyArrayObject *)PyArray_ContiguousFromObject((PyObject *)obj,
+                                                         PyArray_CDOUBLE, 0, 
0);
+      break; 
+
+#ifdef PyArray_BOOL
+   /************************/
+   /* Booleans to booleans */
+   /************************/
+    case PyArray_BOOL:
+      obj = (PyArrayObject *)PyArray_ContiguousFromObject((PyObject *)obj,
+                                                         PyArray_BOOL, 0, 0);
+      break; 
+#endif
+
+    
/********************************************************************************/
+    /* All integers (except perhaps 64 bit integers on 32 bit platforms) to 
integer */
+    
/********************************************************************************/
+    case PyArray_UBYTE:
+    case PyArray_SBYTE:
+    case PyArray_SHORT:
+    case PyArray_INT:
+    case PyArray_LONG:
+#ifdef PyArray_INT8
+    case PyArray_INT8:
+    case PyArray_UINT8:
+    case PyArray_INT16:
+    case PyArray_UINT16:
+    case PyArray_INT32:
+    case PyArray_UINT32:
+#endif
+#if SIZEOF_INT == 8 && defined(PyArray_INT64) /* NumPy on 64 bit platform */
+    case PyArray_INT64:
+    case PyArray_UINT64:
+#endif
+      obj = (PyArrayObject *)PyArray_ContiguousFromObject((PyObject *)obj,
+                                                         PyArray_INT, 0, 0);
+      break;
+
+    /**************************************************/
+    /* All floats (and over-sized integers) to double */
+    /**************************************************/
+    case PyArray_FLOAT:
+    case PyArray_DOUBLE:
+#ifdef PyArray_FLOAT32
+    case PyArray_FLOAT32:
+    case PyArray_FLOAT64:
+#endif
+#if SIZEOF_INT == 4 && defined(PyArray_INT64) /* NumPy on 32 bit platform */
+    case PyArray_INT64:
+    case PyArray_UINT64:
+#endif
+      obj = (PyArrayObject *)PyArray_ContiguousFromObject((PyObject *)obj,
+                                                         PyArray_DOUBLE, 0, 0);
+      break;
+
+    default:
       UNPROTECT(2);
+      PyErr_SetString(RPy_TypeConversionException, "Unhandled type in array, 
unable to convert to R object");
       return R_NilValue;
+      break;
+
     }
-    tl *= dims[i];
-    INTEGER(Rdims)[i] = dims[(obj->nd)-i-1];
-    INTEGER(tRdims)[i] = (obj->nd)-i;
-  }
 
-/*   if (!(pytl = PyList_New(1))) */
-/*     goto exception; */
-/*   if (!(it = PyInt_FromLong(tl))) */
-/*     goto exception; */
-/*   if (PyList_SetItem(pytl, 0, it) < 0) */
-/*     goto exception; */
 
-  pytl = Py_BuildValue("[i]", tl);
-  obj = (PyArrayObject *)PyArray_ContiguousFromObject((PyObject *)obj,
-                                                      PyArray_NOTYPE, 0, 0);
+  pytl = Py_BuildValue("[i]", size);
   nobj = PyArray_Reshape(obj, pytl);
   Py_XDECREF(pytl);
   Py_XDECREF(obj);
-  if (!nobj)
-    goto exception;
 
+  if (nobj == NULL) 
+    {
+      UNPROTECT(2);
+      return R_NilValue;
+    }
+   
+
   PROTECT(Rarray = seq_to_R(nobj));
+  if (Rarray == NULL)
+    {
+      UNPROTECT(3); 
+      return R_NilValue;
+    }
+
+
   Py_XDECREF(nobj);
   SET_DIM(Rarray, Rdims);
   
@@ -361,10 +475,6 @@
 
   UNPROTECT(5);
   return Rarray;
-
- exception:
-  UNPROTECT(2);
-  return NULL;
 }
 #endif
 
@@ -379,7 +489,7 @@
   PyObject *to_r_meth;
   int do_decref = 0;
 
-  if (!obj)
+  if (obj==NULL)
     return NULL;
 
   if (obj == Py_None) {
@@ -390,7 +500,7 @@
   if (to_r_meth) {
     obj = PyObject_CallObject(to_r_meth, NULL);
     Py_DECREF(to_r_meth);
-    if (!obj)
+    if (obj==NULL)
       return NULL;
     do_decref = 1;
   }
@@ -445,7 +555,6 @@
       SET_STRING_ELT(robj, 0, COPY_TO_USER_STRING(PyString_AsString(obj)));
     }
 #ifdef WITH_NUMERIC
-  //else if (PyArray_Check(obj)) 
   else if (use_numeric && PyArray_Check(obj)) 
     {
       PROTECT(robj = to_Rarray(obj));
@@ -457,15 +566,15 @@
       PROTECT(robj = seq_to_R(obj));      /* No labels */
     }
   else if ((PyMapping_Check(obj)) &&
-             (PyMapping_Size(obj) >= 0)) 
+            (PyMapping_Size(obj) >= 0)) 
     {
       PROTECT(robj = dict_to_R(obj));
     }
   else 
     {
-      PyErr_Format(RPyExc_Exception, "cannot convert from type '%s'",
+      PyErr_Format(RPy_TypeConversionException, "cannot convert from type 
'%s'",
                    obj->ob_type->tp_name);
-      PROTECT(robj = NULL);       /* Protected to avoid stack inbalance */
+      PROTECT(robj = NULL);    /* Protected to avoid stack inbalance */
     }
 
   if (do_decref) 
@@ -482,7 +591,7 @@
 {
   int len, i;
   PyObject *it, *dict;
-  char *name;
+  const char *name;
 
   if ((len = PySequence_Length(obj)) < 0)
     return NULL;
@@ -567,7 +676,7 @@
   PyObject *array, *ret, *dims, *it;
   int l, i, j;
 
-  array = PyArray_ContiguousFromObject(seq, PyArray_NOTYPE, 0,0);
+  array = PyArray_ContiguousFromObject(seq, PyArray_DOUBLE, 0,0);
   if (!array)
     return NULL;
 
@@ -630,7 +739,7 @@
   PyObject *it, *tmp;
   SEXP names, dim;
   int len, *integers, i, type;
-  char *strings, *thislevel;
+  const char *strings, *thislevel;
   double *reals;
   Rcomplex *complexes;
 #ifdef WITH_NUMERIC
@@ -906,7 +1015,7 @@
 
   for (i=0; i<largs; i++) {
     r = to_Robj(PyTuple_GetItem(args, i));
-    if (!r)
+    if (!r || PyErr_Occurred() )
       return 0;
     SETCAR(*e, r);
     *e = CDR(*e);
@@ -916,7 +1025,7 @@
 
 /* Implements the conversion rules for names. See the 'USING' file. We
    don't care about '<-' because it doesn't appear in keywords. */
-char *
+const char *
 dotter(char *s)
 {
   char *r, *res;
@@ -946,7 +1055,7 @@
 make_kwds(int lkwds, PyObject *kwds, SEXP *e)
 {
   SEXP r;
-  char *s;
+  const char *s;
   int i;
   PyObject *citems=NULL, *it;
   PyObject *kwname;
@@ -961,7 +1070,7 @@
       goto fail;
     r = to_Robj(PyTuple_GetItem(it, 1));
     Py_DECREF(it);
-    if (!r)
+    if (!r || PyErr_Occurred())
       goto fail;
 
     SETCAR(*e, r);
@@ -977,7 +1086,7 @@
       goto fail;
 
     SET_TAG(*e, Rf_install(s));
-    PyMem_Free(s);
+    PyMem_Free( (void*) s);
     *e = CDR(*e);
   }
   Py_XDECREF(citems);
@@ -1045,7 +1154,7 @@
 make_argl(int largl, PyObject *argl, SEXP *e)
 {
   SEXP rvalue;
-  char *name;
+  const char *name;
   int i;
   PyObject *it, *nobj, *value;
 
@@ -1084,17 +1193,19 @@
 
     /* Value can be anything. */
     value = PySequence_GetItem(it, 1);
-    if (!value) 
+    if (!value || PyErr_Occurred() ) 
       {
-        PyMem_Free(name);
+        PyMem_Free( (void*) name);
         goto fail;
       }
 
     rvalue =  to_Robj(value);
     Py_DECREF(value);
-
     Py_DECREF(it);
 
+    if(PyErr_Occurred())
+      goto fail;
+
     /* Add parameter value to call */
     SETCAR(*e, rvalue);
 
@@ -1102,7 +1213,7 @@
     if (name && strlen(name)>0) 
       {
         SET_TAG(*e, Rf_install(name));
-        PyMem_Free(name);
+        PyMem_Free((void*) name);
       }
 
     /* Move index to new end of call */
@@ -1196,7 +1307,7 @@
 {
   PyObject *obj;
   int conversion=-2;
-  static char *kwlist[] = {"val", 0};
+  char *kwlist[] = {"val", 0};
 
   if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:autoconvert", kwlist,
                                   &conversion))
@@ -1222,7 +1333,7 @@
 Robj_as_py(PyObject *self, PyObject *args, PyObject *kwds)
 {
   PyObject *obj;
-  static char *kwlist[] = {"mode", 0};
+  char *kwlist[] = {"mode", 0};
   int conv=default_mode;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:as_py", kwlist,
@@ -1284,6 +1395,9 @@
   SETCAR(CDR(CDR(e)), ri);
   SETCAR(CDR(CDR(CDR(e))), to_Robj(v));
 
+  if(PyErr_Occurred())
+    return -1;
+
   if (!(robj = do_eval_expr(e))) {
     UNPROTECT(1);
     return -1;
@@ -1741,7 +1855,7 @@
 
   if( !strlen(RHOME) || !strlen(RVERSION) || !strlen(RVER) || !strlen(RUSER))
     {
-      PyErr_Format(RPyExc_Exception,
+      PyErr_Format(RPy_Exception,
                    "Unable to load R path or version information");
       return;
     }
@@ -1789,11 +1903,21 @@
   PyOS_setsig(SIGUSR2, old_usr2);
 #endif
 
-  /* The new exception */
-  RPyExc_Exception = PyErr_NewException("rpy.RException", NULL, NULL);
-  if (RPyExc_Exception)
-    PyDict_SetItemString(d, "RException", RPyExc_Exception);
+  /* Several new exceptions: */
+  RPy_Exception               = PyErr_NewException("rpy.RPy_Exception",        
       NULL,          NULL);
+  RPy_TypeConversionException = 
PyErr_NewException("rpy.RPy_TypeConversionException", RPy_Exception, NULL);
+  RPy_RException              = PyErr_NewException("rpy.RPy_RException",       
       RPy_Exception, NULL);
 
+  if (!RPy_Exception || !RPy_TypeConversionException || !RPy_RException )      
         
+    {
+      PyErr_Format(RPy_Exception, "Unable create RPy exceptions");
+      return;
+    }
+
+  PyDict_SetItemString(d, "RPy_Exception",               RPy_Exception);
+  PyDict_SetItemString(d, "RPy_TypeConversionException", 
RPy_TypeConversionException);
+  PyDict_SetItemString(d, "RPy_RException",              RPy_RException);
+
   // The conversion table
   class_table = PyDict_New();
   proc_table = PyDict_New();

Modified: trunk/rpy/tests/test_array.py
===================================================================
--- trunk/rpy/tests/test_array.py       2007-11-06 16:49:53 UTC (rev 362)
+++ trunk/rpy/tests/test_array.py       2007-11-12 23:27:48 UTC (rev 363)
@@ -15,6 +15,12 @@
     idx.autoconvert(BASIC_CONVERSION)
     return o
 
+def all(vec):
+    for i in range(len(vec)):
+      if not vec[i]: return False
+    return True
+ 
+
 class ArrayTestCase(unittest.TestCase):
 
     def setUp(self):
@@ -28,7 +34,7 @@
             r.array.autoconvert(BASIC_CONVERSION)
 
     def testConversionToPy(self):
-        self.failUnless((self.py == self.ra.as_py()).all(),
+        self.failUnless(all(self.py == self.ra.as_py()),
                         'wrong conversion to Python')
 
     def testConversionToR(self):
@@ -52,7 +58,7 @@
         self.failUnlessRaises(IndexError, lambda: self.py[5][5][5])
                            
     def testROutOfBounds(self):
-        self.failUnlessRaises(RException, lambda: idx(self.ra, 5,5,5))
+        self.failUnlessRaises(RPyException, lambda: idx(self.ra, 5,5,5))
 
     def testBigArray(self):
         a = r.array(range(100000), dim=(100,1000))

Modified: trunk/rpy/tests/test_numeric.py
===================================================================
--- trunk/rpy/tests/test_numeric.py     2007-11-06 16:49:53 UTC (rev 362)
+++ trunk/rpy/tests/test_numeric.py     2007-11-12 23:27:48 UTC (rev 363)
@@ -1,14 +1,14 @@
 from __future__ import nested_scopes
 
 import unittest
+import sys
 try:
     from numpy import *
 except ImportError:
     try:
         from Numeric import *
     except ImportError:
-        print 'Numeric not available. Skipping.\n'
-        import sys
+        print '\nNumeric not available. Skipping.\n'
         sys.exit(0)
     
 import sys
@@ -75,10 +75,102 @@
 
     def testPyOutOfBounds(self):
         self.failUnlessRaises(IndexError, lambda: self.py_c[5,5,5])
-                           
+
     def testROutOfBounds(self):
-        self.failUnlessRaises(RException, lambda: idx(self.ra_c, 5,5,5))
+        self.failUnlessRaises(RPyException, lambda: idx(self.ra_c, 5,5,5))
 
+    def test64BitIntArrays(self):
 
+        # 64 bit ints
+        try:
+            a = array( [1,2,3], 'Int64' )
+        except:
+            try:
+                a = array( [1,2,3], Int64 )
+            except:
+                print "\nInt64 Not found.  Skipping this test.\n"
+                return            
+
+        b = r.c(a[1])
+        b = r.c(a)
+
+    def test32BitIntArrays(self):
+
+        # 32 bit ints
+        try:
+            a = array( [1,2,3], 'Int32' )
+        except:
+            a = array( [1,2,3], Int32 )
+
+        b = r.c(a[1])
+        b = r.c(a)
+
+    def test16BitIntArrays(self):
+
+        # 16 bit ints
+        try:
+            a = array( [1,2,3], 'Int16' )
+        except:
+            a = array( [1,2,3], Int16 )
+            
+        b = r.c(a[1])
+        b = r.c(a)
+
+    def test8BitIntArrays(self):
+
+        # 8 bit ints
+        try:
+            a = array( [1,2,3], 'Int8' )
+        except:
+            a = array( [1,2,3], Int8 )
+        b = r.c(a[1])
+        b = r.c(a)
+
+    def test64BitFloatArrays(self):
+
+        # 64 bit ints
+        try:
+            a = array( [1,2,3], 'Float64' )
+        except:
+            try:
+                a = array( [1,2,3], Float64 )
+            except:
+                print  "Float64 Not found.  Skipping this test."
+                return            
+
+        b = r.c(a[1])
+        b = r.c(a)
+
+    def test32BitFloatArrays(self):
+
+        # 32 bit ints
+        try:
+            a = array( [1,2,3], 'Float32' )
+        except:
+            a = array( [1,2,3], Float32 )
+
+        b = r.c(a[1])
+        b = r.c(a)
+
+    def testCharArrays(self):
+
+        try:
+            a = array( ['A','B', 'C'], 'Char' )
+        except:
+            a = array( ['A','B', 'C'], Character )
+
+        self.failUnlessRaises(RPyTypeConversionException, lambda: r.c(a) )
+
+    def testObjArrays(self):
+
+        try:
+            a = array( ['A','B', 'C'], 'PyObject' )
+        except:
+            a = array( ['A','B', 'C'], PyObject )
+
+        self.failUnlessRaises(RPyTypeConversionException,  lambda: r.c(a)    )
+
+    
+    
 if __name__ == '__main__':
     unittest.main()

Modified: trunk/rpy/tests/test_robj.py
===================================================================
--- trunk/rpy/tests/test_robj.py        2007-11-06 16:49:53 UTC (rev 362)
+++ trunk/rpy/tests/test_robj.py        2007-11-12 23:27:48 UTC (rev 363)
@@ -57,7 +57,7 @@
                         r.attr__ is r['attr<-'])
 
     def testNotFound(self):
-        self.failUnlessRaises(RException, lambda: r.foo)
+        self.failUnlessRaises(RPyException, lambda: r.foo)
         
     def testNameLengthOne(self):
         self.failUnless(r.T)

Modified: trunk/rpy/tests/test_tor.py
===================================================================
--- trunk/rpy/tests/test_tor.py 2007-11-06 16:49:53 UTC (rev 362)
+++ trunk/rpy/tests/test_tor.py 2007-11-12 23:27:48 UTC (rev 363)
@@ -77,13 +77,13 @@
         with_c(f)
 
     def testNotConvertible(self):
-        self.failUnlessRaises(RException, lambda: r.c(range))
+        self.failUnlessRaises(RPyTypeConversionException, lambda: r.c(range))
 
     def testInstancesNotConvertible(self):
         class Foo:
             pass
         a = Foo()
-        self.failUnlessRaises(RException, lambda: r.c(a))
+        self.failUnlessRaises(RPyTypeConversionException, lambda: r.c(a))
 
     def testAs_rMethod(self):
         r.c.autoconvert(BASIC_CONVERSION)
@@ -94,9 +94,12 @@
         self.failUnless(r.c(b) == 'foo')
         self.failUnless(r.c(d)(1,3) == [1,2,3])
 
-    def testMaxintToR(self):
+    def testNAFromR(self):
+        ''' R defines NA value (currently from limits.h MAX_INT)
+        For 64 bit systems this will not be the same as sys.maxint
+        '''
         with_mode(BASIC_CONVERSION,
-                  lambda: self.failUnless(r.is_na(-sys.maxint-1)))()
+                  lambda: self.failUnless(r.is_na(r.NA)))()
 
     def testInfToR(self):
         with_mode(BASIC_CONVERSION, lambda:

Modified: trunk/rpy/tests/test_util.py
===================================================================
--- trunk/rpy/tests/test_util.py        2007-11-06 16:49:53 UTC (rev 362)
+++ trunk/rpy/tests/test_util.py        2007-11-12 23:27:48 UTC (rev 363)
@@ -28,8 +28,8 @@
     def testRCode(self):
         with_mode(BASIC_CONVERSION,
                   lambda: self.failUnless(r("c(4,5)") == [4,5]))()
-        self.failUnlessRaises(RException, lambda: r("foo"))
-        self.failUnlessRaises(RException, lambda: r("[$%^"))
+        self.failUnlessRaises(RPyRException, lambda: r("foo"))
+        self.failUnlessRaises(RPyRException, lambda: r("[$%^"))
 
         
 if __name__ == '__main__':


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: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
rpy-list mailing list
rpy-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rpy-list

Reply via email to