[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