| From 1e02dbe5533d679b9ef064078a303607a7d0542a Mon Sep 17 00:00:00 2001 |
| From: Alexander Kanavin <alex@linutronix.de> |
| Date: Fri, 29 Dec 2023 14:33:38 +0100 |
| Subject: [PATCH] Fix Cython 3 compatibility |
| |
| Upstream-Status: Backport [https://github.com/h5py/h5py/pull/2345/commits] |
| Signed-off-by: Alexander Kanavin <alex@linutronix.de> |
| --- |
| benchmarks/benchmark_slicing.py | 12 ++++---- |
| docs/conf.py | 2 +- |
| docs/high/dataset.rst | 4 +-- |
| docs/high/file.rst | 6 ++-- |
| docs/requirements-rtd.txt | 5 ++-- |
| docs/vds.rst | 2 +- |
| docs/whatsnew/3.0.rst | 2 +- |
| docs/whatsnew/3.7.rst | 4 +-- |
| h5py/_errors.pxd | 10 +++---- |
| h5py/_errors.pyx | 4 +-- |
| h5py/_hl/base.py | 4 +-- |
| h5py/_hl/dataset.py | 8 ++--- |
| h5py/_hl/dims.py | 3 +- |
| h5py/_hl/files.py | 2 +- |
| h5py/_locks.pxi | 6 ++-- |
| h5py/_proxy.pyx | 4 +-- |
| h5py/_selector.pyx | 2 +- |
| h5py/api_compat.h | 13 ++++---- |
| h5py/api_types_hdf5.pxd | 48 +++++++++++++++--------------- |
| h5py/h5fd.pyx | 38 ++++++++++++++++------- |
| h5py/h5p.pyx | 4 +-- |
| h5py/h5t.pyx | 2 +- |
| h5py/tests/test_attrs_data.py | 2 +- |
| h5py/tests/test_big_endian_file.py | 4 +-- |
| h5py/tests/test_dataset.py | 4 +-- |
| h5py/tests/test_file.py | 6 ++-- |
| h5py/tests/test_file_alignment.py | 4 +-- |
| h5py/tests/test_group.py | 4 +-- |
| h5py/tests/test_selections.py | 2 +- |
| pylintrc | 2 +- |
| pyproject.toml | 2 +- |
| setup_configure.py | 2 +- |
| tox.ini | 2 +- |
| 33 files changed, 116 insertions(+), 103 deletions(-) |
| |
| diff --git a/benchmarks/benchmark_slicing.py b/benchmarks/benchmark_slicing.py |
| index e9a34dad..b833f012 100644 |
| --- a/benchmarks/benchmark_slicing.py |
| +++ b/benchmarks/benchmark_slicing.py |
| @@ -7,7 +7,7 @@ import logging |
| logger = logging.getLogger(__name__) |
| import h5py |
| |
| -#Needed for mutithreading: |
| +#Needed for multithreading: |
| from queue import Queue |
| from threading import Thread, Event |
| import multiprocessing |
| @@ -173,8 +173,8 @@ class SlicingBenchmark: |
| |
| if __name__ == "__main__": |
| logging.basicConfig(level=logging.INFO) |
| - benckmark = SlicingBenchmark() |
| - benckmark.setup() |
| - benckmark.time_sequential_reads() |
| - benckmark.time_threaded_reads() |
| - benckmark.teardown() |
| + benchmark = SlicingBenchmark() |
| + benchmark.setup() |
| + benchmark.time_sequential_reads() |
| + benchmark.time_threaded_reads() |
| + benchmark.teardown() |
| diff --git a/docs/conf.py b/docs/conf.py |
| index 93b23939..a0f6c1ac 100644 |
| --- a/docs/conf.py |
| +++ b/docs/conf.py |
| @@ -109,7 +109,7 @@ pygments_style = 'sphinx' |
| |
| # The theme to use for HTML and HTML Help pages. See the documentation for |
| # a list of builtin themes. |
| -html_theme = 'default' |
| +html_theme = 'sphinx_rtd_theme' |
| |
| # Theme options are theme-specific and customize the look and feel of a theme |
| # further. For a list of options available for each theme, see the |
| diff --git a/docs/high/dataset.rst b/docs/high/dataset.rst |
| index 0f27284f..cb75fffe 100644 |
| --- a/docs/high/dataset.rst |
| +++ b/docs/high/dataset.rst |
| @@ -58,7 +58,7 @@ the requested ``dtype``. |
| Reading & writing data |
| ---------------------- |
| |
| -HDF5 datasets re-use the NumPy slicing syntax to read and write to the file. |
| +HDF5 datasets reuse the NumPy slicing syntax to read and write to the file. |
| Slice specifications are translated directly to HDF5 "hyperslab" |
| selections, and are a fast and efficient way to access data in the file. The |
| following slicing arguments are recognized: |
| @@ -464,7 +464,7 @@ Reference |
| >>> dset = f["MyDS"] |
| >>> f.close() |
| >>> if dset: |
| - ... print("datset accessible") |
| + ... print("dataset accessible") |
| ... else: |
| ... print("dataset inaccessible") |
| dataset inaccessible |
| diff --git a/docs/high/file.rst b/docs/high/file.rst |
| index 484498ce..e757fe1a 100644 |
| --- a/docs/high/file.rst |
| +++ b/docs/high/file.rst |
| @@ -392,7 +392,7 @@ Data alignment |
| When creating datasets within files, it may be advantageous to align the offset |
| within the file itself. This can help optimize read and write times if the data |
| become aligned with the underlying hardware, or may help with parallelism with |
| -MPI. Unfortunately, aligning small variables to large blocks can leave alot of |
| +MPI. Unfortunately, aligning small variables to large blocks can leave a lot of |
| empty space in a file. To this effect, application developers are left with two |
| options to tune the alignment of data within their file. The two variables |
| ``alignment_threshold`` and ``alignment_interval`` in the :class:`File` |
| @@ -415,7 +415,7 @@ number of regions. Setting a small value can reduce the overall file size, |
| especially in combination with the ``libver`` option. This controls how the |
| overall data and metadata are laid out within the file. |
| |
| -For more information, see the offical HDF5 documentation `H5P_SET_META_BLOCK_SIZE |
| +For more information, see the official HDF5 documentation `H5P_SET_META_BLOCK_SIZE |
| <https://portal.hdfgroup.org/display/HDF5/H5P_SET_META_BLOCK_SIZE>`_. |
| |
| Reference |
| @@ -497,7 +497,7 @@ Reference |
| Only available with HDF5 >= 1.12.1 or 1.10.x >= 1.10.7. |
| :param alignment_threshold: Together with ``alignment_interval``, this |
| property ensures that any file object greater than or equal |
| - in size to the alignement threshold (in bytes) will be |
| + in size to the alignment threshold (in bytes) will be |
| aligned on an address which is a multiple of alignment interval. |
| :param alignment_interval: This property should be used in conjunction with |
| ``alignment_threshold``. See the description above. For more |
| diff --git a/docs/requirements-rtd.txt b/docs/requirements-rtd.txt |
| index e67a3eee..52096927 100644 |
| --- a/docs/requirements-rtd.txt |
| +++ b/docs/requirements-rtd.txt |
| @@ -1,3 +1,2 @@ |
| -sphinx==4.3.0 |
| -sphinx_rtd_theme==1.0.0 |
| -readthedocs-sphinx-search==0.1.1 |
| +sphinx==7.2.6 |
| +sphinx_rtd_theme==1.3.0 |
| diff --git a/docs/vds.rst b/docs/vds.rst |
| index a9a7c7f6..bd47ad1c 100644 |
| --- a/docs/vds.rst |
| +++ b/docs/vds.rst |
| @@ -124,7 +124,7 @@ Reference |
| slice it to indicate which regions should be used in the virtual dataset. |
| |
| When `creating a virtual dataset <creating_vds_>`_, paths to sources present |
| - in the same file are changed to a ".", refering to the current file (see |
| + in the same file are changed to a ".", referring to the current file (see |
| `H5Pset_virtual <https://portal.hdfgroup.org/display/HDF5/H5P_SET_VIRTUAL>`_). |
| This will keep such sources valid in case the file is renamed. |
| |
| diff --git a/docs/whatsnew/3.0.rst b/docs/whatsnew/3.0.rst |
| index db30ad66..ff3c2bef 100644 |
| --- a/docs/whatsnew/3.0.rst |
| +++ b/docs/whatsnew/3.0.rst |
| @@ -44,7 +44,7 @@ New features |
| See also the deprecation related to the ``external`` argument. |
| * Support for setting file space strategy at file creation. Includes option to |
| persist empty space tracking between sessions. See :class:`.File` for details. |
| -* More efficient writing when assiging a scalar to a chunked dataset, when the |
| +* More efficient writing when assigning a scalar to a chunked dataset, when the |
| number of elements to write is no more than the size of one chunk. |
| * Introduced support for the split :ref:`file driver <file_driver>` |
| (:pr:`1468`). |
| diff --git a/docs/whatsnew/3.7.rst b/docs/whatsnew/3.7.rst |
| index 27790254..2e822d68 100644 |
| --- a/docs/whatsnew/3.7.rst |
| +++ b/docs/whatsnew/3.7.rst |
| @@ -19,7 +19,7 @@ New features |
| include it. Alternatively, you can :ref:`build h5py from source <source_install>` |
| against an HDF5 build with the direct driver enabled. |
| * The :class:`.File` constructor contains two new parameters ``alignment_threshold``, |
| - and ``alignment_interval`` controling the data alignment within the HDF5 |
| + and ``alignment_interval`` controlling the data alignment within the HDF5 |
| file (:pr:`2040`). |
| * :meth:`~.Group.create_dataset` and :meth:`~.Group.require_dataset` now accept |
| parameters ``efile_prefix`` and ``virtual_prefix`` to set a filesystem path |
| @@ -40,7 +40,7 @@ Bug fixes |
| attributes with ``track_order=True``. |
| * Fix for building with mpi4py on Python 3.10 (:pr:`2101`). |
| * Fixed fancy indexing with a boolean array for a single dimension (:pr:`2079`). |
| -* Avoid returning unitialised memory when reading from a chunked dataset with |
| +* Avoid returning uninitialised memory when reading from a chunked dataset with |
| missing chunks and no fill value (:pr:`2076`). |
| * Enable setting of fillvalue for datasets with variable length string dtype |
| (:pr:`2044`). |
| diff --git a/h5py/_errors.pxd b/h5py/_errors.pxd |
| index df9c1bbe..3cba6307 100644 |
| --- a/h5py/_errors.pxd |
| +++ b/h5py/_errors.pxd |
| @@ -23,7 +23,7 @@ cdef extern from "hdf5.h": |
| H5E_ARGS, # invalid arguments to routine |
| H5E_RESOURCE, # resource unavailable |
| H5E_INTERNAL, # Internal error (too specific to document) |
| - H5E_FILE, # file Accessability |
| + H5E_FILE, # file Accessibility |
| H5E_IO, # Low-level I/O |
| H5E_FUNC, # function Entry/Exit |
| H5E_ATOM, # object Atom |
| @@ -121,7 +121,7 @@ cdef extern from "hdf5.h": |
| # No error |
| H5E_NONE_MINOR # No error |
| |
| - # File accessability errors |
| + # File accessibility errors |
| H5E_FILEEXISTS # File already exists |
| H5E_FILEOPEN # File already open |
| H5E_CANTCREATE # Unable to create file |
| @@ -207,7 +207,7 @@ cdef extern from "hdf5.h": |
| H5E_ARGS, # invalid arguments to routine |
| H5E_RESOURCE, # resource unavailable |
| H5E_INTERNAL, # Internal error (too specific to document) |
| - H5E_FILE, # file Accessability |
| + H5E_FILE, # file Accessibility |
| H5E_IO, # Low-level I/O |
| H5E_FUNC, # function Entry/Exit |
| H5E_ID, # object ID |
| @@ -305,7 +305,7 @@ cdef extern from "hdf5.h": |
| # No error |
| H5E_NONE_MINOR # No error |
| |
| - # File accessability errors |
| + # File accessibility errors |
| H5E_FILEEXISTS # File already exists |
| H5E_FILEOPEN # File already open |
| H5E_CANTCREATE # Unable to create file |
| @@ -425,4 +425,4 @@ ctypedef struct err_cookie: |
| cdef err_cookie set_error_handler(err_cookie handler) |
| |
| # Set the default error handler set by silence_errors/unsilence_errors |
| -cdef void set_default_error_handler() nogil |
| +cdef void set_default_error_handler() noexcept nogil |
| diff --git a/h5py/_errors.pyx b/h5py/_errors.pyx |
| index c3bd184e..2a7524b2 100644 |
| --- a/h5py/_errors.pyx |
| +++ b/h5py/_errors.pyx |
| @@ -94,7 +94,7 @@ cdef struct err_data_t: |
| H5E_error_t err |
| int n |
| |
| -cdef herr_t walk_cb(unsigned int n, const H5E_error_t *desc, void *e) nogil noexcept: |
| +cdef herr_t walk_cb(unsigned int n, const H5E_error_t *desc, void *e) noexcept nogil: |
| |
| cdef err_data_t *ee = <err_data_t*>e |
| |
| @@ -168,7 +168,7 @@ cdef err_cookie _error_handler # Store error handler used by h5py |
| _error_handler.func = NULL |
| _error_handler.data = NULL |
| |
| -cdef void set_default_error_handler() nogil: |
| +cdef void set_default_error_handler() noexcept nogil: |
| """Set h5py's current default error handler""" |
| H5Eset_auto(<hid_t>H5E_DEFAULT, _error_handler.func, _error_handler.data) |
| |
| diff --git a/h5py/_hl/base.py b/h5py/_hl/base.py |
| index cad37053..9d261c90 100644 |
| --- a/h5py/_hl/base.py |
| +++ b/h5py/_hl/base.py |
| @@ -20,7 +20,7 @@ import posixpath |
| import numpy as np |
| |
| # The high-level interface is serialized; every public API function & method |
| -# is wrapped in a lock. We re-use the low-level lock because (1) it's fast, |
| +# is wrapped in a lock. We reuse the low-level lock because (1) it's fast, |
| # and (2) it eliminates the possibility of deadlocks due to out-of-order |
| # lock acquisition. |
| from .._objects import phil, with_phil |
| @@ -524,7 +524,7 @@ def product(nums): |
| # Daniel Greenfeld, BSD license), where it is attributed to bottle (Copyright |
| # (c) 2009-2022, Marcel Hellkamp, MIT license). |
| |
| -class cached_property(object): |
| +class cached_property: |
| def __init__(self, func): |
| self.__doc__ = getattr(func, "__doc__") |
| self.func = func |
| diff --git a/h5py/_hl/dataset.py b/h5py/_hl/dataset.py |
| index b69aba48..77b202d2 100644 |
| --- a/h5py/_hl/dataset.py |
| +++ b/h5py/_hl/dataset.py |
| @@ -334,10 +334,10 @@ class ChunkIterator: |
| self._layout = dset.chunks |
| if source_sel is None: |
| # select over entire dataset |
| - slices = [] |
| - for dim in range(rank): |
| - slices.append(slice(0, self._shape[dim])) |
| - self._sel = tuple(slices) |
| + self._sel = tuple( |
| + slice(0, self._shape[dim]) |
| + for dim in range(rank) |
| + ) |
| else: |
| if isinstance(source_sel, slice): |
| self._sel = (source_sel,) |
| diff --git a/h5py/_hl/dims.py b/h5py/_hl/dims.py |
| index d3c9206b..0cf4c9f3 100644 |
| --- a/h5py/_hl/dims.py |
| +++ b/h5py/_hl/dims.py |
| @@ -53,8 +53,7 @@ class DimensionProxy(base.CommonStateObject): |
| |
| @with_phil |
| def __iter__(self): |
| - for k in self.keys(): |
| - yield k |
| + yield from self.keys() |
| |
| @with_phil |
| def __len__(self): |
| diff --git a/h5py/_hl/files.py b/h5py/_hl/files.py |
| index aa4fb78d..bfcf3098 100644 |
| --- a/h5py/_hl/files.py |
| +++ b/h5py/_hl/files.py |
| @@ -480,7 +480,7 @@ class File(Group): |
| |
| alignment_threshold |
| Together with ``alignment_interval``, this property ensures that |
| - any file object greater than or equal in size to the alignement |
| + any file object greater than or equal in size to the alignment |
| threshold (in bytes) will be aligned on an address which is a |
| multiple of alignment interval. |
| |
| diff --git a/h5py/_locks.pxi b/h5py/_locks.pxi |
| index bc8b2dd9..1ec4e2fc 100644 |
| --- a/h5py/_locks.pxi |
| +++ b/h5py/_locks.pxi |
| @@ -63,7 +63,7 @@ cdef class FastRLock: |
| return self._owner == pythread.PyThread_get_thread_ident() |
| |
| |
| -cdef inline bint lock_lock(FastRLock lock, long current_thread, bint blocking) nogil: |
| +cdef inline bint lock_lock(FastRLock lock, long current_thread, bint blocking) noexcept nogil: |
| # Note that this function *must* hold the GIL when being called. |
| # We just use 'nogil' in the signature to make sure that no Python |
| # code execution slips in that might free the GIL |
| @@ -83,7 +83,7 @@ cdef inline bint lock_lock(FastRLock lock, long current_thread, bint blocking) n |
| lock, current_thread, |
| pythread.WAIT_LOCK if blocking else pythread.NOWAIT_LOCK) |
| |
| -cdef bint _acquire_lock(FastRLock lock, long current_thread, int wait) nogil: |
| +cdef bint _acquire_lock(FastRLock lock, long current_thread, int wait) noexcept nogil: |
| # Note that this function *must* hold the GIL when being called. |
| # We just use 'nogil' in the signature to make sure that no Python |
| # code execution slips in that might free the GIL |
| @@ -111,7 +111,7 @@ cdef bint _acquire_lock(FastRLock lock, long current_thread, int wait) nogil: |
| lock._count = 1 |
| return 1 |
| |
| -cdef inline void unlock_lock(FastRLock lock) nogil: |
| +cdef inline void unlock_lock(FastRLock lock) noexcept nogil: |
| # Note that this function *must* hold the GIL when being called. |
| # We just use 'nogil' in the signature to make sure that no Python |
| # code execution slips in that might free the GIL |
| diff --git a/h5py/_proxy.pyx b/h5py/_proxy.pyx |
| index 46b4fe0d..e40504f5 100644 |
| --- a/h5py/_proxy.pyx |
| +++ b/h5py/_proxy.pyx |
| @@ -241,7 +241,7 @@ ctypedef struct h5py_scatter_t: |
| void* buf |
| |
| cdef herr_t h5py_scatter_cb(void* elem, hid_t type_id, unsigned ndim, |
| - const hsize_t *point, void *operator_data) nogil except -1: |
| + const hsize_t *point, void *operator_data) except -1 nogil: |
| cdef h5py_scatter_t* info = <h5py_scatter_t*>operator_data |
| |
| memcpy(elem, (<char*>info[0].buf)+((info[0].i)*(info[0].elsize)), |
| @@ -252,7 +252,7 @@ cdef herr_t h5py_scatter_cb(void* elem, hid_t type_id, unsigned ndim, |
| return 0 |
| |
| cdef herr_t h5py_gather_cb(void* elem, hid_t type_id, unsigned ndim, |
| - const hsize_t *point, void *operator_data) nogil except -1: |
| + const hsize_t *point, void *operator_data) except -1 nogil: |
| cdef h5py_scatter_t* info = <h5py_scatter_t*>operator_data |
| |
| memcpy((<char*>info[0].buf)+((info[0].i)*(info[0].elsize)), elem, |
| diff --git a/h5py/_selector.pyx b/h5py/_selector.pyx |
| index 8b858c82..69970176 100644 |
| --- a/h5py/_selector.pyx |
| +++ b/h5py/_selector.pyx |
| @@ -341,7 +341,7 @@ cdef class Reader: |
| |
| arr = PyArray_ZEROS(arr_rank, arr_shape, self.np_typenum, 0) |
| if not self.native_byteorder: |
| - arr = arr.newbyteorder() |
| + arr = arr.view(arr.dtype.newbyteorder()) |
| finally: |
| efree(arr_shape) |
| |
| diff --git a/h5py/api_compat.h b/h5py/api_compat.h |
| index 52917f4d..a359e827 100644 |
| --- a/h5py/api_compat.h |
| +++ b/h5py/api_compat.h |
| @@ -24,7 +24,6 @@ typedef void *PyMPI_MPI_Message; |
| #include <stddef.h> |
| #include "Python.h" |
| #include "numpy/arrayobject.h" |
| -#include "hdf5.h" |
| |
| /* The HOFFSET macro can't be used from Cython. */ |
| |
| @@ -35,14 +34,14 @@ typedef void *PyMPI_MPI_Message; |
| #define h5py_size_n256 (sizeof(npy_complex256)) |
| #endif |
| |
| -#define h5py_offset_n64_real (HOFFSET(npy_complex64, real)) |
| -#define h5py_offset_n64_imag (HOFFSET(npy_complex64, imag)) |
| -#define h5py_offset_n128_real (HOFFSET(npy_complex128, real)) |
| -#define h5py_offset_n128_imag (HOFFSET(npy_complex128, imag)) |
| +#define h5py_offset_n64_real (0) |
| +#define h5py_offset_n64_imag (sizeof(float)) |
| +#define h5py_offset_n128_real (0) |
| +#define h5py_offset_n128_imag (sizeof(double)) |
| |
| #ifdef NPY_COMPLEX256 |
| -#define h5py_offset_n256_real (HOFFSET(npy_complex256, real)) |
| -#define h5py_offset_n256_imag (HOFFSET(npy_complex256, imag)) |
| +#define h5py_offset_n256_real (0) |
| +#define h5py_offset_n256_imag (sizeof(long double)) |
| #endif |
| |
| #endif |
| diff --git a/h5py/api_types_hdf5.pxd b/h5py/api_types_hdf5.pxd |
| index a198f105..099e0f58 100644 |
| --- a/h5py/api_types_hdf5.pxd |
| +++ b/h5py/api_types_hdf5.pxd |
| @@ -257,27 +257,27 @@ cdef extern from "hdf5.h": |
| herr_t (*sb_encode)(H5FD_t *file, char *name, unsigned char *p) |
| herr_t (*sb_decode)(H5FD_t *f, const char *name, const unsigned char *p) |
| size_t fapl_size |
| - void * (*fapl_get)(H5FD_t *file) |
| - void * (*fapl_copy)(const void *fapl) |
| - herr_t (*fapl_free)(void *fapl) |
| + void * (*fapl_get)(H5FD_t *file) except * |
| + void * (*fapl_copy)(const void *fapl) except * |
| + herr_t (*fapl_free)(void *fapl) except -1 |
| size_t dxpl_size |
| void * (*dxpl_copy)(const void *dxpl) |
| herr_t (*dxpl_free)(void *dxpl) |
| - H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr) |
| - herr_t (*close)(H5FD_t *file) |
| + H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr) except * |
| + herr_t (*close)(H5FD_t *file) except -1 |
| int (*cmp)(const H5FD_t *f1, const H5FD_t *f2) |
| herr_t (*query)(const H5FD_t *f1, unsigned long *flags) |
| herr_t (*get_type_map)(const H5FD_t *file, H5FD_mem_t *type_map) |
| haddr_t (*alloc)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size) |
| herr_t (*free)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, hsize_t size) |
| - haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type) |
| - herr_t (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr) |
| - haddr_t (*get_eof)(const H5FD_t *file, H5FD_mem_t type) |
| + haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type) noexcept |
| + herr_t (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr) noexcept |
| + haddr_t (*get_eof)(const H5FD_t *file, H5FD_mem_t type) except -1 |
| herr_t (*get_handle)(H5FD_t *file, hid_t fapl, void**file_handle) |
| - herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, void *buffer) |
| - herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, const void *buffer) |
| - herr_t (*flush)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) |
| - herr_t (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) |
| + herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, void *buffer) except * |
| + herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, const void *buffer) except * |
| + herr_t (*flush)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) except -1 |
| + herr_t (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) except -1 |
| herr_t (*lock)(H5FD_t *file, hbool_t rw) |
| herr_t (*unlock)(H5FD_t *file) |
| H5FD_mem_t fl_map[<int>H5FD_MEM_NTYPES] |
| @@ -295,27 +295,27 @@ cdef extern from "hdf5.h": |
| herr_t (*sb_encode)(H5FD_t *file, char *name, unsigned char *p) |
| herr_t (*sb_decode)(H5FD_t *f, const char *name, const unsigned char *p) |
| size_t fapl_size |
| - void * (*fapl_get)(H5FD_t *file) |
| - void * (*fapl_copy)(const void *fapl) |
| - herr_t (*fapl_free)(void *fapl) |
| + void * (*fapl_get)(H5FD_t *file) except * |
| + void * (*fapl_copy)(const void *fapl) except * |
| + herr_t (*fapl_free)(void *fapl) except -1 |
| size_t dxpl_size |
| void * (*dxpl_copy)(const void *dxpl) |
| herr_t (*dxpl_free)(void *dxpl) |
| - H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr) |
| - herr_t (*close)(H5FD_t *file) |
| + H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr) except * |
| + herr_t (*close)(H5FD_t *file) except -1 |
| int (*cmp)(const H5FD_t *f1, const H5FD_t *f2) |
| herr_t (*query)(const H5FD_t *f1, unsigned long *flags) |
| herr_t (*get_type_map)(const H5FD_t *file, H5FD_mem_t *type_map) |
| haddr_t (*alloc)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size) |
| herr_t (*free)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, hsize_t size) |
| - haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type) |
| - herr_t (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr) |
| - haddr_t (*get_eof)(const H5FD_t *file, H5FD_mem_t type) |
| + haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type) noexcept |
| + herr_t (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr) noexcept |
| + haddr_t (*get_eof)(const H5FD_t *file, H5FD_mem_t type) except -1 |
| herr_t (*get_handle)(H5FD_t *file, hid_t fapl, void**file_handle) |
| - herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, void *buffer) |
| - herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, const void *buffer) |
| - herr_t (*flush)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) |
| - herr_t (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) |
| + herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, void *buffer) except * |
| + herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, const void *buffer) except * |
| + herr_t (*flush)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) except -1 |
| + herr_t (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) except -1 |
| herr_t (*lock)(H5FD_t *file, hbool_t rw) |
| herr_t (*unlock)(H5FD_t *file) |
| H5FD_mem_t fl_map[<int>H5FD_MEM_NTYPES] |
| diff --git a/h5py/h5fd.pyx b/h5py/h5fd.pyx |
| index e9746057..d39cf68f 100644 |
| --- a/h5py/h5fd.pyx |
| +++ b/h5py/h5fd.pyx |
| @@ -144,10 +144,10 @@ cdef herr_t H5FD_fileobj_close(H5FD_fileobj_t *f) except -1 with gil: |
| stdlib_free(f) |
| return 0 |
| |
| -cdef haddr_t H5FD_fileobj_get_eoa(const H5FD_fileobj_t *f, H5FD_mem_t type): |
| +cdef haddr_t H5FD_fileobj_get_eoa(const H5FD_fileobj_t *f, H5FD_mem_t type) noexcept nogil: |
| return f.eoa |
| |
| -cdef herr_t H5FD_fileobj_set_eoa(H5FD_fileobj_t *f, H5FD_mem_t type, haddr_t addr): |
| +cdef herr_t H5FD_fileobj_set_eoa(H5FD_fileobj_t *f, H5FD_mem_t type, haddr_t addr) noexcept nogil: |
| f.eoa = addr |
| return 0 |
| |
| @@ -191,22 +191,38 @@ cdef herr_t H5FD_fileobj_flush(H5FD_fileobj_t *f, hid_t dxpl, hbool_t closing) e |
| cdef H5FD_class_t info |
| memset(&info, 0, sizeof(info)) |
| |
| +# Cython doesn't support "except X" in casting definition currently |
| +ctypedef herr_t (*file_free_func_ptr)(void *) except -1 |
| + |
| +ctypedef herr_t (*file_close_func_ptr)(H5FD_t *) except -1 |
| +ctypedef haddr_t (*file_get_eoa_func_ptr)(const H5FD_t *, H5FD_mem_t) noexcept |
| +ctypedef herr_t (*file_set_eof_func_ptr)(H5FD_t *, H5FD_mem_t, haddr_t) noexcept |
| +ctypedef haddr_t (*file_get_eof_func_ptr)(const H5FD_t *, H5FD_mem_t) except -1 |
| +ctypedef herr_t (*file_read_func_ptr)(H5FD_t *, H5FD_mem_t, hid_t, haddr_t, size_t, void*) except -1 |
| +ctypedef herr_t (*file_write_func_ptr)(H5FD_t *, H5FD_mem_t, hid_t, haddr_t, size_t, const void*) except -1 |
| +ctypedef herr_t (*file_truncate_func_ptr)(H5FD_t *, hid_t, hbool_t) except -1 |
| +ctypedef herr_t (*file_flush_func_ptr)(H5FD_t *, hid_t, hbool_t) except -1 |
| + |
| + |
| info.name = 'fileobj' |
| info.maxaddr = libc.stdint.SIZE_MAX - 1 |
| info.fc_degree = H5F_CLOSE_WEAK |
| info.fapl_size = sizeof(PyObject *) |
| info.fapl_get = <void *(*)(H5FD_t *)>H5FD_fileobj_fapl_get |
| info.fapl_copy = <void *(*)(const void *)>H5FD_fileobj_fapl_copy |
| -info.fapl_free = <herr_t (*)(void *)>H5FD_fileobj_fapl_free |
| + |
| +info.fapl_free = <file_free_func_ptr>H5FD_fileobj_fapl_free |
| + |
| info.open = <H5FD_t *(*)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr)>H5FD_fileobj_open |
| -info.close = <herr_t (*)(H5FD_t *)>H5FD_fileobj_close |
| -info.get_eoa = <haddr_t (*)(const H5FD_t *, H5FD_mem_t)>H5FD_fileobj_get_eoa |
| -info.set_eoa = <herr_t (*)(H5FD_t *, H5FD_mem_t, haddr_t)>H5FD_fileobj_set_eoa |
| -info.get_eof = <haddr_t (*)(const H5FD_t *, H5FD_mem_t)>H5FD_fileobj_get_eof |
| -info.read = <herr_t (*)(H5FD_t *, H5FD_mem_t, hid_t, haddr_t, size_t, void *)>H5FD_fileobj_read |
| -info.write = <herr_t (*)(H5FD_t *, H5FD_mem_t, hid_t, haddr_t, size_t, const void *)>H5FD_fileobj_write |
| -info.truncate = <herr_t (*)(H5FD_t *, hid_t, hbool_t)>H5FD_fileobj_truncate |
| -info.flush = <herr_t (*)(H5FD_t *, hid_t, hbool_t)>H5FD_fileobj_flush |
| + |
| +info.close = <file_close_func_ptr>H5FD_fileobj_close |
| +info.get_eoa = <file_get_eoa_func_ptr>H5FD_fileobj_get_eoa |
| +info.set_eoa = <file_set_eof_func_ptr>H5FD_fileobj_set_eoa |
| +info.get_eof = <file_get_eof_func_ptr>H5FD_fileobj_get_eof |
| +info.read = <file_read_func_ptr>H5FD_fileobj_read |
| +info.write = <file_write_func_ptr>H5FD_fileobj_write |
| +info.truncate = <file_truncate_func_ptr>H5FD_fileobj_truncate |
| +info.flush = <file_flush_func_ptr>H5FD_fileobj_flush |
| # H5FD_FLMAP_DICHOTOMY |
| info.fl_map = [H5FD_MEM_SUPER, # default |
| H5FD_MEM_SUPER, # super |
| diff --git a/h5py/h5p.pyx b/h5py/h5p.pyx |
| index 779ea1b5..dc8bf65a 100644 |
| --- a/h5py/h5p.pyx |
| +++ b/h5py/h5p.pyx |
| @@ -1177,7 +1177,7 @@ cdef class PropFAID(PropInstanceID): |
| size_t block_size IN: File system block size |
| size_t cbuf_size IN: Copy buffer size |
| |
| - Properites with value of 0 indicate that the HDF5 library should |
| + Properties with value of 0 indicate that the HDF5 library should |
| choose the value. |
| """ |
| H5Pset_fapl_direct(self.id, alignment, block_size, cbuf_size) |
| @@ -1761,7 +1761,7 @@ cdef class PropOCID(PropCreateID): |
| |
| max_compact -- maximum number of attributes to be stored in compact storage(default:8) |
| must be greater than or equal to min_dense |
| - min_dense -- minmum number of attributes to be stored in dense storage(default:6) |
| + min_dense -- minimum number of attributes to be stored in dense storage(default:6) |
| |
| """ |
| H5Pset_attr_phase_change(self.id, max_compact, min_dense) |
| diff --git a/h5py/h5t.pyx b/h5py/h5t.pyx |
| index e7aae14f..b9d7e74d 100644 |
| --- a/h5py/h5t.pyx |
| +++ b/h5py/h5t.pyx |
| @@ -1938,7 +1938,7 @@ def check_dtype(**kwds): |
| |
| vlen = dtype |
| If the dtype represents an HDF5 vlen, returns the Python base class. |
| - Currently only builting string vlens (str) are supported. Returns |
| + Currently only built-in string vlens (str) are supported. Returns |
| None if the dtype does not represent an HDF5 vlen. |
| |
| enum = dtype |
| diff --git a/h5py/tests/test_attrs_data.py b/h5py/tests/test_attrs_data.py |
| index 56481ca0..5083a1aa 100644 |
| --- a/h5py/tests/test_attrs_data.py |
| +++ b/h5py/tests/test_attrs_data.py |
| @@ -262,7 +262,7 @@ class TestEmpty(BaseAttrs): |
| self.assertTrue(is_empty_dataspace(h5a.open(self.f.id, b'y'))) |
| |
| def test_modify(self): |
| - with self.assertRaises(IOError): |
| + with self.assertRaises(OSError): |
| self.f.attrs.modify('x', 1) |
| |
| def test_values(self): |
| diff --git a/h5py/tests/test_big_endian_file.py b/h5py/tests/test_big_endian_file.py |
| index 4d81de01..170b5bcc 100644 |
| --- a/h5py/tests/test_big_endian_file.py |
| +++ b/h5py/tests/test_big_endian_file.py |
| @@ -24,14 +24,14 @@ def test_vlen_big_endian(): |
| assert dset[4] == 1.2 |
| assert dset.dtype == "<f8" |
| |
| - # Same float values with big endianess |
| + # Same float values with big endianness |
| assert f["DSBEfloat"][0] == 3.14 |
| assert f["DSBEfloat"].dtype == ">f8" |
| |
| assert f["DSLEint"][0] == 1 |
| assert f["DSLEint"].dtype == "<u8" |
| |
| - # Same int values with big endianess |
| + # Same int values with big endianness |
| assert f["DSBEint"][0] == 1 |
| assert f["DSBEint"].dtype == ">i8" |
| |
| diff --git a/h5py/tests/test_dataset.py b/h5py/tests/test_dataset.py |
| index e104dd53..0ffa5c80 100644 |
| --- a/h5py/tests/test_dataset.py |
| +++ b/h5py/tests/test_dataset.py |
| @@ -1939,9 +1939,9 @@ class TestCommutative(BaseDataset): |
| dset = self.f.create_dataset("test", shape, dtype=float, |
| data=np.random.rand(*shape)) |
| |
| - # grab a value from the elements, ie dset[0] |
| + # grab a value from the elements, ie dset[0, 0] |
| # check that mask arrays are commutative wrt ==, != |
| - val = np.float64(dset[0]) |
| + val = np.float64(dset[0, 0]) |
| |
| assert np.all((val == dset) == (dset == val)) |
| assert np.all((val != dset) == (dset != val)) |
| diff --git a/h5py/tests/test_file.py b/h5py/tests/test_file.py |
| index b47d408e..1aa38731 100644 |
| --- a/h5py/tests/test_file.py |
| +++ b/h5py/tests/test_file.py |
| @@ -326,7 +326,7 @@ class TestDrivers(TestCase): |
| # could be an integer multiple of 512 |
| # |
| # To allow HDF5 to do the heavy lifting for different platform, |
| - # We didn't provide any argumnets to the first call |
| + # We didn't provide any arguments to the first call |
| # and obtained HDF5's default values there. |
| |
| # Testing creation with a few different property lists |
| @@ -639,9 +639,9 @@ class TestUnicode(TestCase): |
| Modes 'r' and 'r+' do not create files even when given unicode names |
| """ |
| fname = self.mktemp(prefix=chr(0x201a)) |
| - with self.assertRaises(IOError): |
| + with self.assertRaises(OSError): |
| File(fname, 'r') |
| - with self.assertRaises(IOError): |
| + with self.assertRaises(OSError): |
| File(fname, 'r+') |
| |
| |
| diff --git a/h5py/tests/test_file_alignment.py b/h5py/tests/test_file_alignment.py |
| index c280bb76..da13ee04 100644 |
| --- a/h5py/tests/test_file_alignment.py |
| +++ b/h5py/tests/test_file_alignment.py |
| @@ -50,7 +50,7 @@ class TestFileAlignment(TestCase): |
| alignment_interval = 4096 |
| |
| for shape in [ |
| - (1033,), # A prime number above the thresold |
| + (1033,), # A prime number above the threshold |
| (1000,), # Exactly equal to the threshold |
| (1001,), # one above the threshold |
| ]: |
| @@ -75,7 +75,7 @@ class TestFileAlignment(TestCase): |
| alignment_interval = 1024 |
| |
| for shape in [ |
| - (881,), # A prime number below the thresold |
| + (881,), # A prime number below the threshold |
| (999,), # Exactly one below the threshold |
| ]: |
| fname = self.mktemp() |
| diff --git a/h5py/tests/test_group.py b/h5py/tests/test_group.py |
| index 328c352a..4af1fb1f 100644 |
| --- a/h5py/tests/test_group.py |
| +++ b/h5py/tests/test_group.py |
| @@ -771,7 +771,7 @@ class TestExternalLinks(TestCase): |
| with self.assertRaises(KeyError): |
| self.f['ext'] |
| |
| - # I would prefer IOError but there's no way to fix this as the exception |
| + # I would prefer OSError but there's no way to fix this as the exception |
| # class is determined by HDF5. |
| def test_exc_missingfile(self): |
| """ KeyError raised when attempting to open missing file """ |
| @@ -844,7 +844,7 @@ class TestExtLinkBugs(TestCase): |
| try: |
| if x: |
| x.close() |
| - except IOError: |
| + except OSError: |
| pass |
| return w |
| orig_name = self.mktemp() |
| diff --git a/h5py/tests/test_selections.py b/h5py/tests/test_selections.py |
| index 0b1722d7..01f6dcb7 100644 |
| --- a/h5py/tests/test_selections.py |
| +++ b/h5py/tests/test_selections.py |
| @@ -65,7 +65,7 @@ class TestTypeGeneration(BaseSelection): |
| self.assertEqual(out, np.dtype('i')) |
| self.assertEqual(format, np.dtype( [('a','i')] )) |
| |
| - # Field does not apear in named typed |
| + # Field does not appear in named typed |
| with self.assertRaises(ValueError): |
| out, format = sel2.read_dtypes(dt, ('j', 'k')) |
| |
| diff --git a/pylintrc b/pylintrc |
| index 045df2f7..2401d3b0 100644 |
| --- a/pylintrc |
| +++ b/pylintrc |
| @@ -44,7 +44,7 @@ confidence= |
| # can either give multiple identifiers separated by comma (,) or put this |
| # option multiple times (only on the command line, not in the configuration |
| # file where it should appear only once).You can also use "--disable=all" to |
| -# disable everything first and then reenable specific checks. For example, if |
| +# disable everything first and then re-enable specific checks. For example, if |
| # you want to run only the similarities checker, you can use "--disable=all |
| # --enable=similarities". If you want to run only the classes checker, but have |
| # no Warning level messages displayed, use"--disable=all --enable=classes |
| diff --git a/pyproject.toml b/pyproject.toml |
| index ee573d2f..717200ef 100644 |
| --- a/pyproject.toml |
| +++ b/pyproject.toml |
| @@ -1,6 +1,6 @@ |
| [build-system] |
| requires = [ |
| - "Cython >=0.29.31,<1", |
| + "Cython >=0.29.31,<4", |
| "oldest-supported-numpy", |
| "pkgconfig", |
| "setuptools >=61", |
| diff --git a/setup_configure.py b/setup_configure.py |
| index 0fba53ba..c3b86a64 100644 |
| --- a/setup_configure.py |
| +++ b/setup_configure.py |
| @@ -165,7 +165,7 @@ class BuildConfig: |
| try: |
| if pkgconfig.exists(pc_name): |
| pc = pkgconfig.parse(pc_name) |
| - except EnvironmentError: |
| + except OSError: |
| if os.name != 'nt': |
| print( |
| "Building h5py requires pkg-config unless the HDF5 path " |
| diff --git a/tox.ini b/tox.ini |
| index 0efb88a6..86a176dd 100644 |
| --- a/tox.ini |
| +++ b/tox.ini |
| @@ -65,7 +65,7 @@ skip_install=True |
| package_env = DUMMY NON-EXISTENT ENV NAME |
| changedir=docs |
| deps= |
| - sphinx |
| + -r docs/requirements-rtd.txt |
| commands= |
| sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html |
| |