[h5py] 36/455: Updates, tests and API renaming

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Thu Jul 2 18:19:14 UTC 2015


This is an automated email from the git hooks/post-receive script.

ghisvail-guest pushed a commit to annotated tag 1.3.0
in repository h5py.

commit c047273b53a680ab07087cd51b1e9ecfdb16c424
Author: andrewcollette <andrew.collette at gmail.com>
Date:   Wed Jun 4 04:32:43 2008 +0000

    Updates, tests and API renaming
---
 h5py/h5.pxd            |  2 ++
 h5py/h5.pyx            |  5 ++---
 h5py/h5a.pyx           |  5 ++---
 h5py/h5d.pyx           | 47 +++++++++++++++++++-------------------
 h5py/h5f.pyx           | 43 ++++++++++++++++++++---------------
 h5py/h5g.pyx           | 30 +++++++++++++------------
 h5py/h5i.pyx           | 31 +++++++++++++------------
 h5py/h5p.pyx           | 23 +++++++++----------
 h5py/h5r.pyx           | 10 +++++----
 h5py/h5s.pyx           | 53 +++++++++++++++++++++++--------------------
 h5py/h5t.pyx           | 61 ++++++++++++++++++++++++--------------------------
 h5py/h5z.pyx           | 44 +++++++++++++++++++-----------------
 h5py/tests/__init__.py |  5 ++++-
 h5py/tests/common.py   |  2 +-
 h5py/tests/test_h5.py  | 26 +++++++++++++++++++++
 h5py/tests/test_h5a.py | 36 ++++++++++++++++++++++++++---
 h5py/tests/test_h5d.py | 25 ++++++++++++++++-----
 h5py/tests/test_h5f.py | 50 +++++++++++++++++++++++++++++++++++------
 h5py/tests/test_h5g.py | 33 +++++++++++++++++++++++----
 h5py/tests/test_h5i.py | 24 ++++++++++++++++----
 h5py/tests/test_h5p.py | 19 ++++++++++++++++
 h5py/utils_low.c       | 10 ++++++---
 22 files changed, 384 insertions(+), 200 deletions(-)

diff --git a/h5py/h5.pxd b/h5py/h5.pxd
index ff5f95f..ce5bbf3 100644
--- a/h5py/h5.pxd
+++ b/h5py/h5.pxd
@@ -33,6 +33,8 @@ cdef extern from "hdf5.h":
     size_t len                 # Length of VL data (in base type units)
     void *p                    # Pointer to VL data
 
+  int HADDR_UNDEF
+
   herr_t H5open()
   herr_t H5close()
 
diff --git a/h5py/h5.pyx b/h5py/h5.pyx
index 8104d72..c72d7ad 100644
--- a/h5py/h5.pyx
+++ b/h5py/h5.pyx
@@ -70,16 +70,15 @@ class DDict(dict):
 
 # === Error functions =========================================================
 
-cdef herr_t walk_cb(int n, H5E_error_t *err_desc, data):
+cdef herr_t walk_cb(int n, H5E_error_t *err_desc, elist):
 
-    cdef object hstring
     hstring = err_desc.desc
     if len(hstring) == 0:
         hstring = "Error"
     else:
         hstring = '"'+hstring.capitalize()+'"'
 
-    data.append("    "+str(n)+": "+hstring+" at "+err_desc.func_name)
+    elist.append("    "+str(n)+": "+hstring+" at "+err_desc.func_name)
 
     return 0
 
diff --git a/h5py/h5a.pyx b/h5py/h5a.pyx
index cd5a1d0..faa244b 100644
--- a/h5py/h5a.pyx
+++ b/h5py/h5a.pyx
@@ -18,7 +18,7 @@
 
 # Pyrex compile-time imports
 cimport h5
-from defs_c   cimport malloc, free
+from defs_c cimport malloc, free
 from h5  cimport herr_t, hid_t
 from h5p cimport H5P_DEFAULT
 from h5t cimport H5Tclose
@@ -50,7 +50,7 @@ def create(hid_t loc_id, char* name, hid_t type_id, hid_t space_id):
     return retval
 
 def open_idx(hid_t loc_id, unsigned int idx):
-    """ (INT loc_id, UINT index) => INT attr_id
+    """ (INT loc_id, UINT idx) => INT attr_id
 
         Open an exisiting attribute on an object, by zero-based index.
     """
@@ -180,7 +180,6 @@ def get_name(hid_t attr_id):
     """
     cdef int blen
     cdef char* buf
-    cdef object strout
     buf = NULL
 
     blen = H5Aget_name(attr_id, 0, NULL)
diff --git a/h5py/h5d.pyx b/h5py/h5d.pyx
index 697fb13..4d0d983 100644
--- a/h5py/h5d.pyx
+++ b/h5py/h5d.pyx
@@ -24,7 +24,7 @@
 
 # Pyrex compile-time imports
 from defs_c   cimport malloc, free
-from h5  cimport herr_t, hid_t, size_t, hsize_t, htri_t, haddr_t
+from h5  cimport herr_t, hid_t, size_t, hsize_t, htri_t, haddr_t, HADDR_UNDEF
 from h5s cimport H5Sclose, H5S_ALL, H5S_UNLIMITED, H5S_SCALAR, H5S_SIMPLE
 from h5t cimport H5Tclose
 from h5p cimport H5P_DEFAULT
@@ -42,44 +42,26 @@ import_array()
 
 # === Public constants and data structures ====================================
 
-LAYOUT_COMPACT = H5D_COMPACT
-LAYOUT_CONTIGUOUS = H5D_CONTIGUOUS
-LAYOUT_CHUNKED = H5D_CHUNKED
-LAYOUT_MAPPER = { H5D_COMPACT: 'COMPACT', H5D_CONTIGUOUS: 'CONTIGUOUS',
-                  H5D_CHUNKED: 'CHUNKED'}
-LAYOUT_MAPPER = DDict(LAYOUT_MAPPER)
+COMPACT     = H5D_COMPACT
+CONTIGUOUS  = H5D_CONTIGUOUS
+CHUNKED     = H5D_CHUNKED
 
 ALLOC_TIME_DEFAULT  = H5D_ALLOC_TIME_DEFAULT
 ALLOC_TIME_LATE     = H5D_ALLOC_TIME_LATE
 ALLOC_TIME_EARLY    = H5D_ALLOC_TIME_EARLY
 ALLOC_TIME_INCR     = H5D_ALLOC_TIME_INCR
-ALLOC_TIME_MAPPER = { H5D_ALLOC_TIME_DEFAULT: 'DEFAULT', H5D_ALLOC_TIME_LATE:'LATE',
-                      H5D_ALLOC_TIME_EARLY: 'EARLY', H5D_ALLOC_TIME_INCR: 'INCR'}
-ALLOC_TIME_MAPPER = DDict(ALLOC_TIME_MAPPER)
 
 SPACE_STATUS_NOT_ALLOCATED  = H5D_SPACE_STATUS_NOT_ALLOCATED
 SPACE_STATUS_PART_ALLOCATED = H5D_SPACE_STATUS_PART_ALLOCATED
 SPACE_STATUS_ALLOCATED      = H5D_SPACE_STATUS_ALLOCATED
-SPACE_STATUS_MAPPER = { H5D_SPACE_STATUS_NOT_ALLOCATED: 'NOT ALLOCATED', 
-                        H5D_SPACE_STATUS_PART_ALLOCATED: 'PARTIALLY ALLOCATED',
-                        H5D_SPACE_STATUS_ALLOCATED: 'ALLOCATED'}
-SPACE_STATUS_MAPPER = DDict(SPACE_STATUS_MAPPER)
 
 FILL_TIME_ALLOC = H5D_FILL_TIME_ALLOC
 FILL_TIME_NEVER = H5D_FILL_TIME_NEVER
 FILL_TIME_IFSET = H5D_FILL_TIME_IFSET
-FILL_TIME_MAPPER = { H5D_FILL_TIME_ALLOC: 'ALLOCATION TIME',
-                     H5D_FILL_TIME_NEVER: 'NEVER',
-                     H5D_FILL_TIME_IFSET: 'IF SET' }
-FILL_TIME_MAPPER = DDict(FILL_TIME_MAPPER)
 
 FILL_VALUE_UNDEFINED    = H5D_FILL_VALUE_UNDEFINED
 FILL_VALUE_DEFAULT      = H5D_FILL_VALUE_DEFAULT
 FILL_VALUE_USER_DEFINED = H5D_FILL_VALUE_USER_DEFINED
-FILL_VALUE_MAPPER = { H5D_FILL_VALUE_UNDEFINED: 'UNDEFINED',
-                      H5D_FILL_VALUE_DEFAULT: 'DEFAULT',
-                      H5D_FILL_VALUE_USER_DEFINED: 'USER-DEFINED' }
-FILL_VALUE_MAPPER = DDict(FILL_VALUE_MAPPER)
 
 # === Basic dataset operations ================================================
 
@@ -280,9 +262,9 @@ def get_offset(hid_t dset_id):
     """
     cdef haddr_t retval
     retval = H5Dget_offset(dset_id)
-    if retval < 0:
+    if retval == HADDR_UNDEF:
         raise DatasetError("Error determining file offset of dataset %d" % dset_id)
-    return <long long>retval
+    return retval
 
 def get_storage_size(hid_t dset_id):
     """ (INT dset_id) => LONG storage_size
@@ -636,6 +618,23 @@ def py_patch(hid_t ds_source, hid_t ds_sink, hid_t transfer_space):
         if xfer_buf != NULL:
             free(xfer_buf)
 
+PY_LAYOUT = DDict({ H5D_COMPACT: 'COMPACT LAYOUT', 
+               H5D_CONTIGUOUS: 'CONTIGUOUS LAYOUT',
+               H5D_CHUNKED: 'CHUNKED LAYOUT'})
+PY_ALLOC_TIME = DDict({ H5D_ALLOC_TIME_DEFAULT: 'DEFAULT ALLOC TIME', 
+                        H5D_ALLOC_TIME_LATE:'LATE ALLOC TIME',
+                        H5D_ALLOC_TIME_EARLY: 'EARLY ALLOC TIME', 
+                        H5D_ALLOC_TIME_INCR: 'INCR ALLOC TIME' })
+PY_SPACE_STATUS = DDict({ H5D_SPACE_STATUS_NOT_ALLOCATED: 'SPACE NOT ALLOCATED', 
+                    H5D_SPACE_STATUS_PART_ALLOCATED: 'SPACE PARTIALLY ALLOCATED',
+                    H5D_SPACE_STATUS_ALLOCATED: 'SPACE FULLY ALLOCATED'})
+PY_FILL_TIME = DDict({ H5D_FILL_TIME_ALLOC: 'FILL AT ALLOCATION TIME',
+                        H5D_FILL_TIME_NEVER: 'NEVER FILL',
+                        H5D_FILL_TIME_IFSET: 'FILL IF SET'})
+PY_FILL_VALUE = DDict({H5D_FILL_VALUE_UNDEFINED: 'UNDEFINED FILL VALUE',
+                        H5D_FILL_VALUE_DEFAULT: 'DEFAULT FILL VALUE',
+                        H5D_FILL_VALUE_USER_DEFINED: 'USER-DEFINED FILL VALUE'})
+
 
 
 
diff --git a/h5py/h5f.pyx b/h5py/h5f.pyx
index 071fe42..71099c8 100644
--- a/h5py/h5f.pyx
+++ b/h5py/h5f.pyx
@@ -32,22 +32,14 @@ ACC_TRUNC   = H5F_ACC_TRUNC
 ACC_EXCL    = H5F_ACC_EXCL
 ACC_RDWR    = H5F_ACC_RDWR
 ACC_RDONLY  = H5F_ACC_RDONLY
-ACC_MAPPER  = {H5F_ACC_TRUNC: 'TRUNCATE', H5F_ACC_EXCL: 'EXCLUSIVE',
-               H5F_ACC_RDWR: 'READ-WRITE', H5F_ACC_RDONLY: 'READ-ONLY' }
-ACC_MAPPER  = DDict(ACC_MAPPER)
 
 SCOPE_LOCAL     = H5F_SCOPE_LOCAL
 SCOPE_GLOBAL    = H5F_SCOPE_GLOBAL
-SCOPE_MAPPER    = {H5F_SCOPE_LOCAL: 'LOCAL SCOPE', H5F_SCOPE_GLOBAL: 'GLOBAL SCOPE'}
-SCOPE_MAPPER    = DDict(SCOPE_MAPPER)
 
 CLOSE_WEAK = H5F_CLOSE_WEAK
 CLOSE_SEMI = H5F_CLOSE_SEMI
 CLOSE_STRONG = H5F_CLOSE_STRONG
 CLOSE_DEFAULT = H5F_CLOSE_DEFAULT
-CLOSE_MAPPER = {H5F_CLOSE_WEAK: 'WEAK', H5F_CLOSE_SEMI: 'SEMI', 
-                H5F_CLOSE_STRONG: 'STRONG', H5F_CLOSE_DEFAULT: 'DEFAULT'}
-CLOSE_MAPPER = DDict(CLOSE_MAPPER)
 
 OBJ_FILE    = H5F_OBJ_FILE
 OBJ_DATASET = H5F_OBJ_DATASET
@@ -56,10 +48,6 @@ OBJ_DATATYPE = H5F_OBJ_DATATYPE
 OBJ_ATTR    = H5F_OBJ_ATTR
 OBJ_ALL     = H5F_OBJ_ALL
 OBJ_LOCAL   = H5F_OBJ_LOCAL
-OBJ_MAPPER = {H5F_OBJ_FILE: 'FILE', H5F_OBJ_DATASET: 'DATASET',
-              H5F_OBJ_GROUP: 'GROUP', H5F_OBJ_DATATYPE: 'DATATYPE',
-              H5F_OBJ_ATTR: 'ATTRIBUTE', H5F_OBJ_ALL: 'ALL', H5F_OBJ_LOCAL: 'LOCAL'}
-OBJ_MAPPER = DDict(OBJ_MAPPER)
 
 # === File operations =========================================================
 
@@ -255,26 +243,45 @@ def get_obj_ids(hid_t file_id, int types):
         specific identifier.
 
     """
+    cdef int count
     cdef int retval
     cdef hid_t *obj_list
     cdef int i
+
     obj_list = NULL
     py_obj_list = []
 
     try:
-        retval = H5Fget_obj_ids(file_id, types, -1, obj_list)
+        count = H5Fget_obj_count(file_id, types)
+        if count < 0:
+            raise FileError("Failed to count open identifiers.")
+
+        obj_list = <hid_t*>malloc(sizeof(hid_t)*count)
+        retval = H5Fget_obj_ids(file_id, types, count, obj_list)
         if retval < 0:
             raise FileError("Failed to enumerate open objects of types %d in file %d" % (types, file_id))
 
-        for i from 0<=i<retval:
-            py_obj_list[i] = obj_list[i]
+        for i from 0<=i<count:
+            py_obj_list.append(obj_list[i])
     finally:
-        if obj_list != NULL:
-            free(obj_list)
+        free(obj_list)
 
     return py_obj_list
 
-
+# === Python extensions =======================================================
+
+PY_SCOPE = DDict({  H5F_SCOPE_LOCAL: 'LOCAL SCOPE', 
+                    H5F_SCOPE_GLOBAL: 'GLOBAL SCOPE' })
+PY_CLOSE = DDict({ H5F_CLOSE_WEAK: 'CLOSE WEAK', 
+                    H5F_CLOSE_SEMI: 'CLOSE SEMI', 
+                    H5F_CLOSE_STRONG: 'CLOSE STRONG', 
+                    H5F_CLOSE_DEFAULT: 'DEFAULT CLOSE STRENGTH' })
+PY_OBJ = DDict({ H5F_OBJ_FILE: 'FILE', H5F_OBJ_DATASET: 'DATASET',
+                H5F_OBJ_GROUP: 'GROUP', H5F_OBJ_DATATYPE: 'DATATYPE',
+                H5F_OBJ_ATTR: 'ATTRIBUTE', H5F_OBJ_ALL: 'ALL', 
+                H5F_OBJ_LOCAL: 'LOCAL' })
+PY_ACC = DDict({ H5F_ACC_TRUNC: 'TRUNCATE', H5F_ACC_EXCL: 'EXCLUSIVE ACCESS',
+                 H5F_ACC_RDWR: 'READ-WRITE', H5F_ACC_RDONLY: 'READ-ONLY' })
 
 
 
diff --git a/h5py/h5g.pyx b/h5py/h5g.pyx
index 233f39a..009df46 100644
--- a/h5py/h5g.pyx
+++ b/h5py/h5g.pyx
@@ -26,22 +26,16 @@ from errors import GroupError
 # === Public constants and data structures ====================================
 
 # Enumerated object types for groups "H5G_obj_t"
-OBJ_UNKNOWN  = H5G_UNKNOWN
-OBJ_LINK     = H5G_LINK
-OBJ_GROUP    = H5G_GROUP
-OBJ_DATASET  = H5G_DATASET
-OBJ_DATATYPE = H5G_TYPE
-OBJ_MAPPER = { H5G_UNKNOWN: "UNKNOWN", H5G_LINK: "LINK", H5G_GROUP: "GROUP",
-                 H5G_DATASET: "DATASET", H5G_TYPE: "DATATYPE" }
-OBJ_MAPPER = DDict(OBJ_MAPPER)
+UNKNOWN  = H5G_UNKNOWN
+LINK     = H5G_LINK
+GROUP    = H5G_GROUP
+DATASET  = H5G_DATASET
+DATATYPE = H5G_TYPE
 
 # Enumerated link types "H5G_link_t"
 LINK_ERROR = H5G_LINK_ERROR
 LINK_HARD  = H5G_LINK_HARD
 LINK_SOFT  = H5G_LINK_SOFT
-LINK_MAPPER = { H5G_LINK_ERROR: "ERROR", H5G_LINK_HARD: "HARDLINK", 
-                H5G_LINK_SOFT: "SOFTLINK" }
-LINK_MAPPER = DDict(LINK_MAPPER)
 
 cdef class GroupStat:
     """ Represents the H5G_stat_t structure containing group member info.
@@ -191,7 +185,11 @@ def get_objtype_by_idx(hid_t loc_id, hsize_t idx):
     """ (INT loc_id, INT idx) => INT object_type_code
 
         Get the type of an object attached to a group, given its zero-based
-        index.  Return value is one of the OBJ_* constants.
+        index.  Possible return values are:
+            - LINK
+            - GROUP
+            - DATASET
+            - DATATYPE
     """
     cdef int retval
 
@@ -296,7 +294,7 @@ def get_linkval(hid_t loc_id, char* name):
         raise GroupError('Can\'t stat "%s" under group %d' % (name, loc_id))
 
     if statbuf.type != H5G_LINK:
-        raise GroupError('"%s" is not a symbolic link (type is %s)' % (name, OBJ_MAPPER[statbuf.type]))
+        raise GroupError('"%s" is not a symbolic link (type is %s)' % (name, PY_NAMES[statbuf.type]))
 
     value = <char*>malloc(statbuf.linklen+1)
     retval = H5Gget_linkval(loc_id, name, statbuf.linklen+1, value)
@@ -412,7 +410,11 @@ def py_exists(hid_t group_id, char* name, int follow_link=1):
         return False
     return True
 
-
+PY_TYPE = DDict({H5G_UNKNOWN: "UNKNOWN OBJ TYPE", 
+            H5G_LINK: "LINK", H5G_GROUP: "GROUP",
+            H5G_DATASET: "DATASET", H5G_TYPE: "DATATYPE" })
+PY_LINK = DDict({H5G_LINK_ERROR: "ERROR", H5G_LINK_HARD: "HARDLINK", 
+                H5G_LINK_SOFT: "SOFTLINK" })
 
 
 
diff --git a/h5py/h5i.pyx b/h5py/h5i.pyx
index 56c78ef..cb0f443 100644
--- a/h5py/h5i.pyx
+++ b/h5py/h5i.pyx
@@ -25,22 +25,21 @@ from errors import IdentifierError
 
 # === Public constants and data structures ====================================
 
-TYPE_BADID = H5I_BADID
-TYPE_FILE = H5I_FILE
-TYPE_GROUP = H5I_GROUP
-TYPE_DATASPACE = H5I_GROUP
-TYPE_DATASET = H5I_DATASET
-TYPE_ATTR = H5I_ATTR
-TYPE_REFERENCE = H5I_REFERENCE
-TYPE_GENPROP_CLS = H5I_GENPROP_CLS
-TYPE_GENPROP_LST = H5I_GENPROP_LST
-TYPE_DATATYPE = H5I_DATATYPE
-
-TYPE_MAPPER = { H5I_BADID: 'BAD ID', H5I_FILE: 'FILE', H5I_GROUP: 'GROUP',
-                 H5I_DATASET: 'DATASET', H5I_ATTR: 'ATTRIBUTE', 
-                 H5I_REFERENCE: 'REFERENCE', H5I_GENPROP_CLS: 'PROPERTY LIST CLASS',
-                 H5I_GENPROP_LST: 'PROPERTY LIST', H5I_DATATYPE: 'DATATYPE' }
-TYPE_MAPPER = DDict(TYPE_MAPPER)
+BADID       = H5I_BADID
+FILE        = H5I_FILE
+GROUP       = H5I_GROUP
+DATASPACE   = H5I_DATASPACE
+DATASET     = H5I_DATASET
+ATTR        = H5I_ATTR
+REFERENCE   = H5I_REFERENCE
+GENPROP_CLS = H5I_GENPROP_CLS
+GENPROP_LST = H5I_GENPROP_LST
+DATATYPE    = H5I_DATATYPE
+
+PY_TYPE = DDict({ H5I_BADID: 'BAD ID', H5I_FILE: 'FILE', H5I_GROUP: 'GROUP',
+            H5I_DATASET: 'DATASET', H5I_ATTR: 'ATTRIBUTE', 
+            H5I_REFERENCE: 'REFERENCE', H5I_GENPROP_CLS: 'PROPERTY LIST CLASS',
+            H5I_GENPROP_LST: 'PROPERTY LIST', H5I_DATATYPE: 'DATATYPE' })
 
 # === Identifier API ==========================================================
 
diff --git a/h5py/h5p.pyx b/h5py/h5p.pyx
index 448bdf9..bc2b6ab 100644
--- a/h5py/h5p.pyx
+++ b/h5py/h5p.pyx
@@ -30,19 +30,14 @@ from errors import PropertyError, ConversionError
 
 # === Public constants and data structures ====================================
 
-# Property list classes (I'm surprised there's no enum for this)
-CLASS_NO_CLASS       = H5P_NO_CLASS
-CLASS_FILE_CREATE    = H5P_FILE_CREATE
-CLASS_FILE_ACCESS    = H5P_FILE_ACCESS
-CLASS_DATASET_CREATE = H5P_DATASET_CREATE
-CLASS_DATASET_XFER   = H5P_DATASET_XFER
+# Property list classes
+NO_CLASS       = H5P_NO_CLASS
+FILE_CREATE    = H5P_FILE_CREATE
+FILE_ACCESS    = H5P_FILE_ACCESS
+DATASET_CREATE = H5P_DATASET_CREATE
+DATASET_XFER   = H5P_DATASET_XFER
 
-CLASS_MAPPER = { H5P_NO_CLASS: 'ERROR', H5P_FILE_CREATE: 'FILE CREATION',
-                  H5P_FILE_ACCESS: 'FILE ACCESS', H5P_DATASET_CREATE: 'DATASET CREATION',
-                  H5P_DATASET_XFER: 'DATASET TRANSFER'}
-CLASS_MAPPER = DDict(CLASS_MAPPER)
-
-DEFAULT = H5P_DEFAULT # not really a "class"
+DEFAULT = H5P_DEFAULT
 
 # === Generic property list operations ========================================
 
@@ -391,6 +386,10 @@ def py_has_filter(hid_t plist, int filter_class):
         return False
     return True
     
+PY_CLASS = DDict({ H5P_NO_CLASS: 'ERROR', H5P_FILE_CREATE: 'FILE CREATION',
+            H5P_FILE_ACCESS: 'FILE ACCESS', H5P_DATASET_CREATE: 'DATASET CREATION',
+            H5P_DATASET_XFER: 'DATASET TRANSFER', H5P_DEFAULT: 'DEFAULT'})
+
     
 
     
diff --git a/h5py/h5r.pyx b/h5py/h5r.pyx
index 9559c64..b44f6c3 100644
--- a/h5py/h5r.pyx
+++ b/h5py/h5r.pyx
@@ -15,14 +15,16 @@ from h5g cimport H5G_obj_t
 
 # Runtime imports
 import h5
+from h5 import DDict
 from errors import H5ReferenceError
 
 # === Public constants and data structures ====================================
 
-TYPE_OBJECT = H5R_OBJECT
-TYPE_REGION = H5R_DATASET_REGION
-TYPE_MAPPER = {H5R_OBJECT: 'OBJECT',  H5R_DATASET_REGION: 'DATASET REGION' }
-TYPE_MAPPER = DDict(TYPE_MAPPER)
+OBJECT = H5R_OBJECT
+REGION = H5R_DATASET_REGION
+
+PY_TYPE = {H5R_OBJECT: 'OBJECT',  H5R_DATASET_REGION: 'DATASET REGION' }
+PY_TYPE = DDict(PY_TYPE)
 
 cdef union ref_u:
     hobj_ref_t         obj_ref
diff --git a/h5py/h5s.pyx b/h5py/h5s.pyx
index 349148f..4b29f42 100644
--- a/h5py/h5s.pyx
+++ b/h5py/h5s.pyx
@@ -27,7 +27,6 @@ import h5
 from h5 import DDict
 from errors import DataspaceError
 
-
 # === Public constants and data structures ====================================
 
 #enum H5S_seloper_t:
@@ -41,34 +40,21 @@ SELECT_NOTA     = H5S_SELECT_NOTA
 SELECT_APPEND   = H5S_SELECT_APPEND
 SELECT_PREPEND  = H5S_SELECT_PREPEND
 SELECT_INVALID  = H5S_SELECT_INVALID 
-SELECT_MAPPER = {H5S_SELECT_NOOP: 'NO-OP', H5S_SELECT_SET: 'SET', H5S_SELECT_OR: 'OR',
-                 H5S_SELECT_AND: 'AND', H5S_SELECT_XOR: 'XOR', H5S_SELECT_NOTB: 'NOTB',
-                 H5S_SELECT_NOTA: 'NOTA', H5S_SELECT_APPEND: 'APPEND',
-                 H5S_SELECT_PREPEND: 'PREPEND', H5S_SELECT_INVALID: 'INVALID' }
-SELECT_MAPPER = DDict(SELECT_MAPPER)
 
-SPACE_ALL       = H5S_ALL
-SPACE_UNLIMITED = H5S_UNLIMITED
-SPACE_MAPPER = DDict({H5S_ALL: 'ALL', H5S_UNLIMITED: 'UNLIMITED'})
+ALL       = H5S_ALL
+UNLIMITED = H5S_UNLIMITED
 
 #enum H5S_class_t
-CLASS_NO_CLASS = H5S_NO_CLASS
-CLASS_SCALAR   = H5S_SCALAR
-CLASS_SIMPLE   = H5S_SIMPLE
-CLASS_MAPPER = {H5S_NO_CLASS: 'NO CLASS', H5S_SCALAR: 'SCALAR',
-                H5S_SIMPLE: 'SIMPLE'}
-CLASS_MAPPER = DDict(CLASS_MAPPER)
+NO_CLASS = H5S_NO_CLASS
+SCALAR   = H5S_SCALAR
+SIMPLE   = H5S_SIMPLE
 
 #enum H5S_sel_type
-SEL_ERROR = H5S_SEL_ERROR
-SEL_NON = H5S_SEL_NONE
-SEL_POINTS = H5S_SEL_POINTS
-SEL_HYPERSLABS = H5S_SEL_HYPERSLABS
-SEL_ALL = H5S_SEL_ALL
-SEL_MAPPER = {H5S_SEL_ERROR: 'ERROR', H5S_SEL_NONE: 'NONE', 
-              H5S_SEL_POINTS: 'POINTS', H5S_SEL_HYPERSLABS: 'HYPERSLABS',
-              H5S_SEL_ALL: 'ALL'}
-SEL_MAPPER = DDict(SEL_MAPPER) 
+SEL_ERROR       = H5S_SEL_ERROR
+SEL_NONE        = H5S_SEL_NONE
+SEL_POINTS      = H5S_SEL_POINTS
+SEL_HYPERSLABS  = H5S_SEL_HYPERSLABS
+SEL_ALL         = H5S_SEL_ALL
 
 # === Basic dataspace operations ==============================================
 
@@ -654,6 +640,25 @@ def select_hyperslab(hid_t space_id, object start, object count,
         if block_array != NULL:
             free(block_array)
 
+# === Python extensions =======================================================
+
+PY_CLASS = DDict({H5S_ALL: 'ALL', H5S_UNLIMITED: 'UNLIMITED',
+            H5S_NO_CLASS: 'NO CLASS', H5S_SCALAR: 'CLASS SCALAR',
+            H5S_SIMPLE: 'CLASS SIMPLE'})
+PY_SEL = DDict({ H5S_SEL_ERROR: 'SELECTION ERROR', H5S_SEL_NONE: 'SELECT NONE', 
+            H5S_SEL_POINTS: 'POINT SELECTION', 
+            H5S_SEL_HYPERSLABS: 'HYPERSLAB SELECTION',
+            H5S_SEL_ALL: 'SELECT ALL' })
+
+PY_SELECT = DDict({ H5S_SELECT_NOOP: 'NO-OP SELECT', 
+                    H5S_SELECT_SET: 'SET SELECT', 
+                    H5S_SELECT_OR: 'OR SELECT',
+                    H5S_SELECT_AND: 'AND SELECT', H5S_SELECT_XOR: 'XOR SELECT', 
+                    H5S_SELECT_NOTB: 'NOTB SELECT', H5S_SELECT_NOTA: 'NOTA SELECT', 
+                    H5S_SELECT_APPEND: 'APPEND SELECTION',
+                    H5S_SELECT_PREPEND: 'PREPEND SELECTION', 
+                    H5S_SELECT_INVALID: 'INVALID SELECTION' })
+
 
 
 
diff --git a/h5py/h5t.pyx b/h5py/h5t.pyx
index ca199dd..5911cc4 100644
--- a/h5py/h5t.pyx
+++ b/h5py/h5t.pyx
@@ -74,43 +74,33 @@ H5Eset_auto(NULL,NULL)
 # === Public constants and data structures ====================================
 
 # Enumeration H5T_class_t
-CLASS_NO_CLASS  = H5T_NO_CLASS
-CLASS_INTEGER   = H5T_INTEGER
-CLASS_FLOAT     = H5T_FLOAT
-CLASS_TIME      = H5T_TIME
-CLASS_STRING    = H5T_STRING
-CLASS_BITFIELD  = H5T_BITFIELD
-CLASS_OPAQUE    = H5T_OPAQUE
-CLASS_COMPOUND  = H5T_COMPOUND
-CLASS_REFERENCE = H5T_REFERENCE
-CLASS_ENUM      = H5T_ENUM
-CLASS_VLEN      = H5T_VLEN
-CLASS_ARRAY     = H5T_ARRAY
-CLASS_MAPPER = {H5T_NO_CLASS: "ERROR", H5T_INTEGER: "INTEGER", H5T_FLOAT: "FLOAT",
-                H5T_TIME: "TIME", H5T_STRING: "STRING", H5T_BITFIELD: "BITFIELD",
-                H5T_OPAQUE: "OPAQUE", H5T_COMPOUND: "COMPOUND", H5T_REFERENCE: "REFERENCE",
-                H5T_ENUM: "ENUM", H5T_VLEN: "VLEN", H5T_ARRAY: "ARRAY"}
-CLASS_MAPPER = DDict(CLASS_MAPPER)
+NO_CLASS  = H5T_NO_CLASS
+INTEGER   = H5T_INTEGER
+FLOAT     = H5T_FLOAT
+TIME      = H5T_TIME
+STRING    = H5T_STRING
+BITFIELD  = H5T_BITFIELD
+OPAQUE    = H5T_OPAQUE
+COMPOUND  = H5T_COMPOUND
+REFERENCE = H5T_REFERENCE
+ENUM      = H5T_ENUM
+VLEN      = H5T_VLEN
+ARRAY     = H5T_ARRAY
 
 # Enumeration H5T_sign_t
-SIGN_NONE   = H5T_SGN_NONE
-SIGN_2      = H5T_SGN_2
-SIGN_MAPPER = {H5T_SGN_NONE: "UNSIGNED", H5T_SGN_2: "SIGNED"}
-SIGN_MAPPER = DDict(SIGN_MAPPER)
+SGN_NONE   = H5T_SGN_NONE
+SGN_2      = H5T_SGN_2
 
 # Enumeration H5T_order_t
 ORDER_LE    = H5T_ORDER_LE
 ORDER_BE    = H5T_ORDER_BE
 ORDER_VAX   = H5T_ORDER_VAX
 ORDER_NONE  = H5T_ORDER_NONE
-ORDER_MAPPER = {H5T_ORDER_LE: "LITTLE-ENDIAN", H5T_ORDER_BE: "BIG-ENDIAN",
-                H5T_ORDER_VAX: "VAX MIXED-ENDIAN", H5T_ORDER_NONE: "NONE" }
-ORDER_MAPPER = DDict(ORDER_MAPPER)
 
 if sys.byteorder == "little":    # Custom python addition
-    pyORDER_NATIVE = H5T_ORDER_LE
+    ORDER_NATIVE = H5T_ORDER_LE
 else:
-    pyORDER_NATIVE = H5T_ORDER_BE
+    ORDER_NATIVE = H5T_ORDER_BE
 
 # --- Built-in HDF5 datatypes -------------------------------------------------
 
@@ -160,8 +150,8 @@ CSTRING = H5T_C_S1
 def create(int classtype, size_t size):
     """ (INT class, INT size) => INT type_id
         
-        Create a new HDF5 type object.  Legal values are CLASS_COMPOUND, 
-        CLASS_OPAQUE, CLASS_ENUM
+        Create a new HDF5 type object.  Legal values are COMPOUND, 
+        OPAQUE, ENUM
     """
     cdef hid_t retval
     retval = H5Tcreate(<H5T_class_t>classtype, size)
@@ -239,7 +229,7 @@ def lock(hid_t type_id):
 def get_class(hid_t type_id):
     """ (INT type_id) => INT class
 
-        Get <type_id>'s class, one of h5t.CLASS_*
+        Get <type_id>'s class.
     """
 
     cdef int classtype
@@ -394,8 +384,7 @@ def get_member_class(hid_t type_id, int member):
     """ (INT type_id, INT member_index) => INT class
 
         Determine the datatype class of the member of a compound type,
-        identified by its index (must be 0 <= idx <= nmembers).  Returns
-        one of h5t.CLASS_*
+        identified by its index (must be 0 <= idx <= nmembers).
     """
 
     cdef int retval
@@ -854,7 +843,7 @@ def py_h5t_to_dtype(hid_t type_id, object byteorder=None,
         shape = get_array_dims(type_id)
         typeobj = dtype( (base_dtype, shape) )
     else:
-        raise ConversionError('Unsupported datatype class "%s"' % CLASS_MAPPER[classtype])
+        raise ConversionError('Unsupported datatype class "%s"' % PY_NAMES[classtype])
 
     if byteorder is not None:
         return typeobj.newbyteorder(byteorder)
@@ -1051,8 +1040,16 @@ def py_can_convert_dtype(object dt, object complex_names=None):
 
     return can_convert
 
+PY_SIGN = DDict({H5T_SGN_NONE: "UNSIGNED", H5T_SGN_2: "SIGNED"})
 
+PY_CLASS = DDict({ H5T_NO_CLASS: "ERROR", H5T_INTEGER: "INTEGER", 
+                    H5T_FLOAT: "FLOAT", H5T_TIME: "TIME", H5T_STRING: "STRING", 
+                    H5T_BITFIELD: "BITFIELD", H5T_OPAQUE: "OPAQUE", 
+                    H5T_COMPOUND: "COMPOUND", H5T_REFERENCE: "REFERENCE",
+                    H5T_ENUM: "ENUM", H5T_VLEN: "VLEN", H5T_ARRAY: "ARRAY" })
 
+PY_ORDER = DDict({ H5T_ORDER_LE: "LITTLE-ENDIAN", H5T_ORDER_BE: "BIG-ENDIAN",
+                    H5T_ORDER_VAX: "VAX MIXED-ENDIAN", H5T_ORDER_NONE: "NONE" })
 
 
 
diff --git a/h5py/h5z.pyx b/h5py/h5z.pyx
index 603a881..3860870 100644
--- a/h5py/h5z.pyx
+++ b/h5py/h5z.pyx
@@ -35,11 +35,6 @@ FILTER_SZIP     = H5Z_FILTER_SZIP
 FILTER_RESERVED = H5Z_FILTER_RESERVED
 FILTER_MAX      = H5Z_FILTER_MAX
 FILTER_NMAX     = H5Z_MAX_NFILTERS
-_FILTER_MAPPER = { H5Z_FILTER_ERROR: 'ERROR', H5Z_FILTER_NONE: 'NONE',
-                   H5Z_FILTER_ALL: 'ALL', H5Z_FILTER_DEFLATE: 'DEFLATE',
-                   H5Z_FILTER_SHUFFLE: 'SHUFFLE', H5Z_FILTER_FLETCHER32: 'FLETCHER32',
-                   H5Z_FILTER_SZIP: 'SZIP', H5Z_FILTER_RESERVED: 'RESERVED'}
-FILTER_MAPPER = DDict(_FILTER_MAPPER)
 
 FLAG_DEFMASK    = H5Z_FLAG_DEFMASK
 FLAG_MANDATORY  = H5Z_FLAG_MANDATORY
@@ -47,26 +42,17 @@ FLAG_OPTIONAL   = H5Z_FLAG_OPTIONAL
 FLAG_INVMASK    = H5Z_FLAG_INVMASK
 FLAG_REVERSE    = H5Z_FLAG_REVERSE
 FLAG_SKIP_EDC   = H5Z_FLAG_SKIP_EDC
-_FLAG_MAPPER = {H5Z_FLAG_DEFMASK: 'DEFMASK', H5Z_FLAG_MANDATORY: 'MANDATORY',
-                H5Z_FLAG_OPTIONAL: 'OPTIONAL', H5Z_FLAG_INVMASK: 'INVMASK',
-                H5Z_FLAG_REVERSE: 'REVERSE', H5Z_FLAG_SKIP_EDC: 'SKIP EDC' }
-FLAG_MAPPER = DDict(_FLAG_MAPPER)
 
 #skip SZIP options
 
-CONFIG_ENCODE_ENABLED = H5Z_FILTER_CONFIG_ENCODE_ENABLED
-CONFIG_DECODE_ENABLED = H5Z_FILTER_CONFIG_DECODE_ENABLED
-_CONFIG_MAPPER = { H5Z_FILTER_CONFIG_ENCODE_ENABLED: 'ENCODE ENABLED',
-                   H5Z_FILTER_CONFIG_DECODE_ENABLED: 'ENCODE DISABLED' }
-CONFIG_MAPPER = DDict(_CONFIG_MAPPER)
+FILTER_CONFIG_ENCODE_ENABLED = H5Z_FILTER_CONFIG_ENCODE_ENABLED
+FILTER_CONFIG_DECODE_ENABLED = H5Z_FILTER_CONFIG_DECODE_ENABLED
+
+ERROR_EDC   = H5Z_ERROR_EDC
+DISABLE_EDC = H5Z_DISABLE_EDC
+ENABLE_EDC  = H5Z_ENABLE_EDC
+NO_EDC      = H5Z_NO_EDC
 
-EDC_ERROR   = H5Z_ERROR_EDC
-EDC_DISABLE = H5Z_DISABLE_EDC
-EDC_ENABLE  = H5Z_ENABLE_EDC
-EDC_NONE    = H5Z_NO_EDC
-_EDC_MAPPER = { H5Z_ERROR_EDC: 'ERROR', H5Z_DISABLE_EDC: 'DISABLE EDC',
-                H5Z_ENABLE_EDC: 'ENABLE EDC', H5Z_NO_EDC: 'NO EDC' }
-EDC_MAPPER = DDict(_EDC_MAPPER)
 
 # === Filter API  =============================================================
 
@@ -87,6 +73,22 @@ def get_filter_info(int filter_id):
         raise FilterError("Can't determine flags of filter %d" % filter_id)
     return flags
 
+# === Python extensions =======================================================
+
+PY_FILTER = DDict({ H5Z_FILTER_ERROR: 'ERROR', H5Z_FILTER_NONE: 'NONE',
+            H5Z_FILTER_ALL: 'ALL', H5Z_FILTER_DEFLATE: 'DEFLATE',
+            H5Z_FILTER_SHUFFLE: 'SHUFFLE', H5Z_FILTER_FLETCHER32: 'FLETCHER32',
+            H5Z_FILTER_SZIP: 'SZIP', H5Z_FILTER_RESERVED: 'RESERVED'})
+
+PY_FLAG = DDict({ H5Z_FLAG_DEFMASK: 'DEFMASK', H5Z_FLAG_MANDATORY: 'MANDATORY',
+            H5Z_FLAG_OPTIONAL: 'OPTIONAL', H5Z_FLAG_INVMASK: 'INVMASK',
+            H5Z_FLAG_REVERSE: 'REVERSE', H5Z_FLAG_SKIP_EDC: 'SKIP EDC' })
+
+PY_FILTER_CONFIG = DDict({H5Z_FILTER_CONFIG_ENCODE_ENABLED: 'ENCODE ENABLED',
+                        H5Z_FILTER_CONFIG_DECODE_ENABLED: 'ENCODE DISABLED'})
+
+PY_EDC   = DDict({H5Z_ERROR_EDC: 'ERROR', H5Z_DISABLE_EDC: 'DISABLE EDC',
+                    H5Z_ENABLE_EDC: 'ENABLE EDC', H5Z_NO_EDC: 'NO EDC' })
 
 
 
diff --git a/h5py/tests/__init__.py b/h5py/tests/__init__.py
index 27f75bf..7334db0 100644
--- a/h5py/tests/__init__.py
+++ b/h5py/tests/__init__.py
@@ -17,11 +17,14 @@ import test_h5f
 import test_h5g
 import test_h5i
 import test_h5d
+import test_h5p
+import test_h5
 
 from h5py import h5a, h5f, h5g, h5d, h5s, h5i, h5z, h5p, highlevel
 
 TEST_CASES = (test_h5a.TestH5A, test_h5f.TestH5F, test_h5g.TestH5G,
-              test_h5i.TestH5I, test_h5d.TestH5D)
+              test_h5i.TestH5I, test_h5d.TestH5D, test_h5.TestH5,
+              test_h5p.TestH5P)
 
 def buildsuite(cases):
 
diff --git a/h5py/tests/common.py b/h5py/tests/common.py
index cc5e558..109ca1a 100644
--- a/h5py/tests/common.py
+++ b/h5py/tests/common.py
@@ -22,7 +22,7 @@ def getcopy(filename):
     newname = tempfile.mktemp('.hdf5')
     shutil.copy(filename, newname)
 
-    plist = h5p.create(h5p.CLASS_FILE_ACCESS)
+    plist = h5p.create(h5p.FILE_ACCESS)
     h5p.set_fclose_degree(plist, h5f.CLOSE_STRONG)
     fid = h5f.open(newname, h5f.ACC_RDWR)
     h5p.close(plist)
diff --git a/h5py/tests/test_h5.py b/h5py/tests/test_h5.py
new file mode 100644
index 0000000..1e47990
--- /dev/null
+++ b/h5py/tests/test_h5.py
@@ -0,0 +1,26 @@
+#+
+# 
+# This file is part of h5py, a low-level Python interface to the HDF5 library.
+# 
+# Copyright (C) 2008 Andrew Collette
+# http://h5py.alfven.org
+# License: BSD  (See LICENSE.txt for full license)
+# 
+# $Date$
+# 
+#-
+import unittest
+
+from h5py import h5
+
+class TestH5(unittest.TestCase):
+
+    def test_version(self):
+        # For 1.6 API
+        tpl = h5.get_libversion()
+
+        self.assertEqual(tpl, h5.HDF5_VERS_TPL)
+        self.assertEqual("%d.%d.%d" % tpl, h5.HDF5_VERS)
+        self.assertEqual(h5.API_VERS, '1.6')
+        self.assertEqual(h5.API_VERS_TPL, (1,6))
+
diff --git a/h5py/tests/test_h5a.py b/h5py/tests/test_h5a.py
index e290649..506e481 100644
--- a/h5py/tests/test_h5a.py
+++ b/h5py/tests/test_h5a.py
@@ -19,7 +19,7 @@ from h5py import h5f, h5g, h5i, h5t, h5s
 import h5py
 from common import getcopy, deletecopy, errstr
 
-from h5py.errors import DatatypeError
+from h5py.errors import DatatypeError, H5AttributeError
 
 HDFNAME = os.path.join(os.path.dirname(h5py.__file__), 'tests/data/attributes.hdf5')
 OBJECTNAME = 'Group'
@@ -41,7 +41,7 @@ class TestH5A(unittest.TestCase):
         h5f.close(self.fid)
 
     def is_attr(self, aid):
-        return (h5i.get_type(aid) == h5i.TYPE_ATTR)
+        return (h5i.get_type(aid) == h5i.ATTR)
 
     # === General attribute operations ========================================
 
@@ -52,7 +52,7 @@ class TestH5A(unittest.TestCase):
             arr_ref = array(value, dtype=dt)
             arr_fail = ones((15,15), dtype=dt)
 
-            sid = h5s.create(h5s.CLASS_SCALAR)
+            sid = h5s.create(h5s.SCALAR)
             tid = h5t.py_dtype_to_h5t(dt)
 
             aid = h5a.create(obj, name, tid, sid)
@@ -71,11 +71,16 @@ class TestH5A(unittest.TestCase):
         h5g.close(obj)
         deletecopy(fid, filename)
         
+        self.assertRaises(H5AttributeError, h5a.create, -1, "FOOBAR", -1, -1)
+        self.assertRaises(H5AttributeError, h5a.write, -1, arr_ref)
+
     def test_open_idx(self):
         for idx, name in enumerate(ATTRIBUTES_ORDER):
             aid = h5a.open_idx(self.obj, idx)
             self.assert_(self.is_attr(aid), "Open: index %d" % idx)
             h5a.close(aid)
+    
+        self.assertRaises(H5AttributeError, h5a.open_idx, -1, 0)
 
     def test_open_name(self):
         for name in ATTRIBUTES:
@@ -83,12 +88,16 @@ class TestH5A(unittest.TestCase):
             self.assert_(self.is_attr(aid), 'Open: name "%s"' % name)
             h5a.close(aid)
 
+        self.assertRaises(H5AttributeError, h5a.open_name, -1, "foo")
+
     def test_close(self):
         aid = h5a.open_idx(self.obj, 0)
         self.assert_(self.is_attr(aid))
         h5a.close(aid)
         self.assert_(not self.is_attr(aid))
     
+        self.assertRaises(H5AttributeError, h5a.close, -1)
+
     def test_delete(self):
         fid, filename = getcopy(HDFNAME)
         obj = h5g.open(fid, OBJECTNAME)
@@ -97,6 +106,8 @@ class TestH5A(unittest.TestCase):
         self.assert_(not h5a.py_exists(obj, ATTRIBUTES_ORDER[0]))
         deletecopy(fid, filename)
 
+        self.assertRaises(H5AttributeError, h5a.delete, -1, "foo")
+
     # === Attribute I/O =======================================================
 
     def test_read(self):
@@ -117,6 +128,8 @@ class TestH5A(unittest.TestCase):
 
             h5a.close(aid)
         
+        self.assertRaises(H5AttributeError, h5a.read, -1, arr_holder)
+
     # h5a.write is done by test_create_write
 
     # === Attribute inspection ================================================
@@ -124,6 +137,7 @@ class TestH5A(unittest.TestCase):
     def test_get_num_attrs(self):
         n = h5a.get_num_attrs(self.obj)
         self.assertEqual(n, len(ATTRIBUTES))
+        self.assertRaises(H5AttributeError, h5a.get_num_attrs, -1)
 
     def test_get_name(self):
     
@@ -133,6 +147,8 @@ class TestH5A(unittest.TestCase):
             self.assertEqual(supposed_name, name)
             h5a.close(aid)
 
+        self.assertRaises(H5AttributeError, h5a.get_name, -1)
+
     def test_get_space(self):
 
         for name, (value, dt, shape) in ATTRIBUTES.iteritems():
@@ -143,6 +159,8 @@ class TestH5A(unittest.TestCase):
             h5s.close(sid)
             h5a.close(aid)
 
+        self.assertRaises(H5AttributeError, h5a.get_space, -1)
+
     def test_get_type(self):
 
         for name, (value, dt, shape) in ATTRIBUTES.iteritems():
@@ -153,6 +171,8 @@ class TestH5A(unittest.TestCase):
             h5t.close(tid)
             h5a.close(aid)
 
+        self.assertRaises(H5AttributeError, h5a.get_type, -1)
+
     def test_iterate(self):
 
         def iterate_all(id, name, namelist):
@@ -184,11 +204,14 @@ class TestH5A(unittest.TestCase):
         h5a.iterate(self.obj, iterate_two, namelist, 1)
         self.assertEqual(namelist, ATTRIBUTES_ORDER[1:3])
 
+        self.assertRaises(H5AttributeError, h5a.iterate, -1, iterate_two, namelist)
+
 
     # === Python extensions ===================================================
 
     def test_py_listattrs(self):
         self.assertEqual(h5a.py_listattrs(self.obj), ATTRIBUTES_ORDER)
+        self.assertRaises(H5AttributeError, h5a.py_listattrs, -1)
 
     def test_py_shape(self):
         
@@ -197,6 +220,7 @@ class TestH5A(unittest.TestCase):
             retshape = h5a.py_shape(aid)
             self.assertEqual(retshape, shape) 
             h5a.close(aid)
+        self.assertRaises(H5AttributeError, h5a.py_shape, -1)
 
     def test_py_dtype(self):
 
@@ -204,6 +228,7 @@ class TestH5A(unittest.TestCase):
             aid = h5a.open_name(self.obj, name)
             self.assertEqual(h5a.py_dtype(aid),dt)
             h5a.close(aid)
+        self.assertRaises(H5AttributeError, h5a.py_dtype, -1)
 
     def test_py_get(self):
 
@@ -212,6 +237,7 @@ class TestH5A(unittest.TestCase):
             arr_returned = h5a.py_get(self.obj, name)
             self.assert_(all(arr_returned == arr_reference), 
                 errstr(arr_reference, arr_returned))
+        self.assertRaises(H5AttributeError, h5a.py_get, -1, "foo")
 
     def test_py_set(self):
 
@@ -226,6 +252,8 @@ class TestH5A(unittest.TestCase):
         h5g.close(obj)
         deletecopy(fid, filename)
 
+        self.assertRaises(H5AttributeError, h5a.py_set, -1, "foo", arr_reference)
+
 
     def test_py_exists(self):
 
@@ -234,6 +262,8 @@ class TestH5A(unittest.TestCase):
 
         self.assert_(not h5a.py_exists(self.obj, 'SOME OTHER ATTRIBUTE') )
             
+        # py_exists will never intentionally raise an exception
+
 
 
 
diff --git a/h5py/tests/test_h5d.py b/h5py/tests/test_h5d.py
index 96701ed..fef9665 100644
--- a/h5py/tests/test_h5d.py
+++ b/h5py/tests/test_h5d.py
@@ -48,9 +48,9 @@ class TestH5D(unittest.TestCase):
 
     def test_open_close(self):
         h5d.close(self.did)
-        self.assertEqual(h5i.get_type(self.did), h5i.TYPE_BADID)
+        self.assertEqual(h5i.get_type(self.did), h5i.BADID)
         self.did = h5d.open(self.fid, "CompoundChunked")
-        self.assertEqual(h5i.get_type(self.did), h5i.TYPE_DATASET)
+        self.assertEqual(h5i.get_type(self.did), h5i.DATASET)
 
         self.assertRaises(DatasetError, h5d.open, self.fid, "Something else")
         self.assertRaises(DatasetError, h5d.close, -1)
@@ -58,11 +58,11 @@ class TestH5D(unittest.TestCase):
     def test_read(self):
         array = numpy.ndarray(SHAPE, dtype=DTYPE)
 
-        h5d.read(self.did, h5s.SPACE_ALL, h5s.SPACE_ALL, array)
+        h5d.read(self.did, h5s.ALL, h5s.ALL, array)
         for name in DTYPE.fields:
             self.assert_(numpy.all(array[name] == basearray[name]), "%s::\n%s\n!=\n%s" % (name, array[name], basearray[name]))
 
-        self.assertRaises(DatasetError, h5d.read, -1, h5s.SPACE_ALL, h5s.SPACE_ALL, array)
+        self.assertRaises(DatasetError, h5d.read, -1, h5s.ALL, h5s.ALL, array)
 
     def test_get_space(self):
         sid = h5d.get_space(self.did)
@@ -73,11 +73,24 @@ class TestH5D(unittest.TestCase):
             h5s.close(sid)
         self.assertRaises(DatasetError, h5d.get_space, -1)
 
+    def test_get_space_status(self):
+        status = h5d.get_space_status(self.did)
+        self.assert_(status in h5d.PY_SPACE_STATUS)
+        self.assertRaises(DatasetError, h5d.get_space_status, -1)
+
+    def test_get_offset(self):
+        # Chunked datasets have no offset.  New test dset needed.
+        self.assertRaises(DatasetError, h5d.get_offset, -1)
+
+    def test_get_storage_size(self):
+        # This function can't intentionally raise an exception.
+        self.assert_(h5d.get_storage_size(self.did) >= 0)
+
     def test_get_type(self):
         # We're not testing datatype conversion here; that's for test_h5t
         tid = h5d.get_type(self.did)
         try:
-            self.assertEqual(h5i.get_type(tid), h5i.TYPE_DATATYPE)
+            self.assertEqual(h5i.get_type(tid), h5i.DATATYPE)
         finally:
             h5t.close(tid)
         self.assertRaises(DatasetError, h5d.get_type, -1)
@@ -85,7 +98,7 @@ class TestH5D(unittest.TestCase):
     def test_get_create_plist(self):
         pid = h5d.get_create_plist(self.did)
         try:
-            self.assertEqual(h5i.get_type(pid), h5i.TYPE_GENPROP_LST)
+            self.assertEqual(h5i.get_type(pid), h5i.GENPROP_LST)
         finally:
             h5p.close(pid)
 
diff --git a/h5py/tests/test_h5f.py b/h5py/tests/test_h5f.py
index e05c1f5..dbe31eb 100644
--- a/h5py/tests/test_h5f.py
+++ b/h5py/tests/test_h5f.py
@@ -15,7 +15,7 @@ import tempfile
 import os
 
 import h5py
-from h5py import h5f, h5i
+from h5py import h5f, h5i, h5p
 from h5py.errors import FileError
 from common import getcopy, deletecopy, errstr
 
@@ -23,11 +23,17 @@ HDFNAME = os.path.join(os.path.dirname(h5py.__file__), 'tests/data/attributes.hd
 
 class TestH5F(unittest.TestCase):
 
+    def setUp(self):
+        self.fid = h5f.open(HDFNAME, h5f.ACC_RDONLY)
+
+    def tearDown(self):
+        h5f.close(self.fid)
+
     def test_open_close(self):
-        fid = h5f.open(HDFNAME)
-        self.assertEqual(h5i.get_type(fid), h5i.TYPE_FILE)
+        fid = h5f.open(HDFNAME, h5f.ACC_RDONLY)
+        self.assertEqual(h5i.get_type(fid), h5i.FILE)
         h5f.close(fid)
-        self.assertEqual(h5i.get_type(fid), h5i.TYPE_BADID)
+        self.assertEqual(h5i.get_type(fid), h5i.BADID)
 
         self.assertRaises(FileError, h5f.open, 'SOME OTHER NAME')
         self.assertRaises(FileError, h5f.close, -1)
@@ -35,16 +41,16 @@ class TestH5F(unittest.TestCase):
     def test_create(self):
         name = tempfile.mktemp('.hdf5')
         fid = h5f.create(name)
-        self.assertEqual(h5i.get_type(fid), h5i.TYPE_FILE)
+        self.assertEqual(h5i.get_type(fid), h5i.FILE)
         h5f.close(fid)
         self.assertRaises(FileError, h5f.create, name, h5f.ACC_EXCL)
         os.unlink(name)
 
     def test_flush(self):
-        fid = h5f.open(HDFNAME, h5f.ACC_RDWR)
+        fid, fname = getcopy(HDFNAME)
         h5f.flush(fid)
         self.assertRaises(FileError, h5f.flush, -1)
-        h5f.close(fid)
+        deletecopy(fid, fname)
 
     def test_is_hdf5(self):
         fd, name = tempfile.mkstemp('.hdf5')
@@ -56,9 +62,39 @@ class TestH5F(unittest.TestCase):
 
         self.assert_(h5f.is_hdf5(HDFNAME))
 
+    def test_get_filesize(self):
+
+        self.assertEqual(h5f.get_filesize(self.fid), os.stat(HDFNAME).st_size)
+        self.assertRaises(FileError, h5f.get_filesize, -1)
 
+    def test_get_create_plist(self):
+        cplist = h5f.get_create_plist(self.fid)
+        self.assert_(h5p.equal(h5p.get_class(cplist), h5p.FILE_CREATE))
+        h5p.close(cplist)
+        self.assertRaises(FileError, h5f.get_create_plist, -1)
 
+    def test_get_access_plist(self):
+        aplist = h5f.get_access_plist(self.fid)
+        self.assert_(h5p.equal(h5p.get_class(aplist), h5p.FILE_ACCESS))
+        h5p.close(aplist)
+        self.assertRaises(FileError, h5f.get_access_plist, -1)
 
+    def test_get_freespace(self):
+        self.assert_(h5f.get_freespace(self.fid) >= 0)
+        self.assertRaises(FileError, h5f.get_freespace, -1)
+
+    def test_get_name(self):
+        self.assertEqual(h5f.get_name(self.fid), HDFNAME)
+        self.assertRaises(FileError, h5f.get_name, -1)
+
+    def test_get_obj_count(self):
+        self.assert_(h5f.get_obj_count(self.fid, h5f.OBJ_ALL) >= 0)
+        self.assertRaises(FileError, h5f.get_obj_count, -1, h5f.OBJ_ALL)
+    
+    def test_get_obj_ids(self):
+        idlist = h5f.get_obj_ids(self.fid, h5f.OBJ_ALL)
+        self.assert_(isinstance(idlist, list))
+        self.assertRaises(FileError, h5f.get_obj_ids, -1, h5f.OBJ_ALL)
 
 
 
diff --git a/h5py/tests/test_h5g.py b/h5py/tests/test_h5g.py
index 1bce6f5..7159d56 100644
--- a/h5py/tests/test_h5g.py
+++ b/h5py/tests/test_h5g.py
@@ -36,7 +36,7 @@ class TestH5G(unittest.TestCase):
         h5f.close(self.fid)
 
     def is_grp(self, item):
-        return h5i.get_type(item) == h5i.TYPE_GROUP
+        return h5i.get_type(item) == h5i.GROUP
 
     def test_open_close(self):
         for name in TEST_GROUPS:
@@ -59,7 +59,16 @@ class TestH5G(unittest.TestCase):
 
         deletecopy(fid, filename)
 
-    def test_link_unlink_move(self):
+    def test_link_unlink_move_linkval(self):
+        fid, filename = getcopy(HDFNAME)
+        obj = h5g.open(fid, OBJECTNAME)
+
+        # symlink
+        h5g.link(obj, TEST_GROUPS[1], NEW_LINK_NAME, h5g.LINK_SOFT)
+        self.assertEqual(h5g.get_objinfo(obj, NEW_LINK_NAME, follow_link=False).type, h5g.LINK)
+        self.assertEqual(h5g.get_linkval(obj, NEW_LINK_NAME), TEST_GROUPS[1])
+
+        deletecopy(fid, filename)
         fid, filename = getcopy(HDFNAME)
         obj = h5g.open(fid, OBJECTNAME)
 
@@ -76,10 +85,12 @@ class TestH5G(unittest.TestCase):
         h5g.link(obj, TEST_GROUPS[0], NEW_LINK_NAME, h5g.LINK_HARD, rgid)
         self.assert_( h5g.py_exists(rgid, NEW_LINK_NAME) )
     
+        # remote unlink
         h5g.unlink(rgid, NEW_LINK_NAME)
         self.assert_( not h5g.py_exists(rgid, NEW_LINK_NAME) )
         h5g.close(rgid)
 
+        # move
         h5g.move(obj, TEST_GROUPS[2], NEW_LINK_NAME)
         self.assert_(h5g.py_exists(obj, NEW_LINK_NAME))
         self.assert_(not h5g.py_exists(obj, TEST_GROUPS[2]))
@@ -87,6 +98,7 @@ class TestH5G(unittest.TestCase):
         self.assertRaises(GroupError, h5g.move, obj, 'Ghost group', 'blah')
         self.assertRaises(GroupError, h5g.unlink, obj, 'Some other name')
         self.assertRaises(GroupError, h5g.link, obj, 'Ghost group', 'blah') 
+        self.assertRaises(GroupError, h5g.get_linkval, -1, "foobar")
 
         h5g.close(obj)
 
@@ -101,7 +113,7 @@ class TestH5G(unittest.TestCase):
 
         for idx, name in enumerate(TEST_GROUPS):
             self.assertEqual(h5g.get_objname_by_idx(self.obj, idx), name)
-            self.assertEqual(h5g.get_objtype_by_idx(self.obj, idx), h5g.OBJ_GROUP)
+            self.assertEqual(h5g.get_objtype_by_idx(self.obj, idx), h5g.GROUP)
 
         self.assertRaises(GroupError, h5g.get_objname_by_idx, self.obj, -1)
         self.assertRaises(GroupError, h5g.get_objtype_by_idx, self.obj, -1)
@@ -112,7 +124,7 @@ class TestH5G(unittest.TestCase):
         retval.fileno
         retval.objno
         self.assertEqual(retval.nlink, 1)
-        self.assertEqual(retval.type, h5g.OBJ_GROUP)
+        self.assertEqual(retval.type, h5g.GROUP)
         retval.mtime
         retval.linklen
 
@@ -150,6 +162,19 @@ class TestH5G(unittest.TestCase):
         h5g.iterate(self.obj, '.', iterate_two, namelist, 1)
         self.assertEqual(namelist, TEST_GROUPS[1:3])
 
+    def test_get_set_comment(self):
+
+        fid, filename = getcopy(HDFNAME)
+        obj = h5g.open(fid, OBJECTNAME)
+
+        h5g.set_comment(obj, TEST_GROUPS[0], "This is a comment.")
+        self.assertEqual(h5g.get_comment(obj, TEST_GROUPS[0]), "This is a comment.")
+
+        self.assertRaises(GroupError, h5g.set_comment, -1, "foo", "bar")
+        self.assertRaises(GroupError, h5g.get_comment, -1, "foo")
+
+        deletecopy(fid, filename)
+
     def test_py_listnames(self):
 
         self.assertEqual(h5g.py_listnames(self.obj), TEST_GROUPS)
diff --git a/h5py/tests/test_h5i.py b/h5py/tests/test_h5i.py
index a026ee0..b2086f9 100644
--- a/h5py/tests/test_h5i.py
+++ b/h5py/tests/test_h5i.py
@@ -14,7 +14,7 @@ import os
 
 import h5py
 from h5py import h5f, h5g, h5i, h5t
-from h5py.errors import H5Error
+from h5py.errors import H5Error, IdentifierError
 
 HDFNAME = os.path.join(os.path.dirname(h5py.__file__), 'tests/data/attributes.hdf5')
 OBJECTNAME = 'Group'
@@ -30,17 +30,33 @@ class TestH5I(unittest.TestCase):
         h5f.close(self.fid)
 
     def test_get_type(self):
-        self.assertEqual(h5i.get_type(self.fid), h5i.TYPE_FILE)
-        self.assertEqual(h5i.get_type(self.obj), h5i.TYPE_GROUP)
-        self.assertEqual(h5i.get_type(-1), h5i.TYPE_BADID)
+        self.assertEqual(h5i.get_type(self.fid), h5i.FILE)
+        self.assertEqual(h5i.get_type(self.obj), h5i.GROUP)
+        self.assertEqual(h5i.get_type(-1), h5i.BADID)
 
     def test_get_name(self):
         self.assertEqual(h5i.get_name(self.obj), '/Group')
         self.assertEqual(h5i.get_name(h5t.STD_I8LE), None)
         self.assertEqual(h5i.get_name(-1), None)
 
+    def test_get_file_id(self):
+        nfid = h5i.get_file_id(self.obj)
+        self.assertEqual(nfid, self.fid)
+        self.assertRaises(IdentifierError, h5i.get_file_id, -1)
 
+    def test_refs(self):
+        refcnt = h5i.get_ref(self.obj)
+        self.assert_(refcnt >= 0)
+        
+        h5i.inc_ref(self.obj)
+        self.assertEqual(h5i.get_ref(self.obj), refcnt+1)
 
+        h5i.dec_ref(self.obj)
+        self.assertEqual(h5i.get_ref(self.obj), refcnt)
+
+        self.assertRaises(IdentifierError, h5i.get_ref, -1)
+        self.assertRaises(IdentifierError, h5i.inc_ref, -1)
+        self.assertRaises(IdentifierError, h5i.dec_ref, -1)
 
 
 
diff --git a/h5py/tests/test_h5p.py b/h5py/tests/test_h5p.py
new file mode 100644
index 0000000..813756b
--- /dev/null
+++ b/h5py/tests/test_h5p.py
@@ -0,0 +1,19 @@
+#+
+# 
+# This file is part of h5py, a low-level Python interface to the HDF5 library.
+# 
+# Copyright (C) 2008 Andrew Collette
+# http://h5py.alfven.org
+# License: BSD  (See LICENSE.txt for full license)
+# 
+# $Date$
+# 
+#-
+
+import unittest
+
+import h5py
+from h5py import h5p, h5i
+
+class TestH5P(unittest.TestCase):
+    pass
diff --git a/h5py/utils_low.c b/h5py/utils_low.c
index 3d132b4..1ecca26 100644
--- a/h5py/utils_low.c
+++ b/h5py/utils_low.c
@@ -24,19 +24,23 @@
 #include "utils_low.h"
 #include "hdf5.h"
 
-/* Wrapper for malloc(size) */
+/* Wrapper for malloc(size) with the following behavior:
+   1. Always returns NULL for emalloc(0)
+   2. Raises RuntimeError for emalloc(size<0)
+   3. Raises RuntimeError if allocation fails (malloc returns NULL)
+*/
 void* emalloc(size_t size){
 
     void *retval = NULL;
 
     if(size==0) return NULL;
     if(size<0){
-		PyErr_SetString(PyExc_RuntimeError, ".");
+		PyErr_SetString(PyExc_RuntimeError, "Attempted negative malloc (h5py emalloc)");
     }
 
     retval = malloc(size);
     if(retval == NULL){
-        PyErr_SetString(PyExc_RuntimeError, ".");
+        PyErr_SetString(PyExc_RuntimeError, "Memory allocation failed (h5py emalloc)");
     }
 
     return retval;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/h5py.git



More information about the debian-science-commits mailing list