add ability to dump proxy classes to arrays, tests for doing so and json dumping

This commit is contained in:
sneakers-the-rat 2024-09-20 18:28:38 -07:00
parent 99a6571578
commit 2cb09076fd
Signed by untrusted user who does not match committer: jonny
GPG key ID: 6DCB96EF1E4D232D
4 changed files with 44 additions and 3 deletions

View file

@ -134,10 +134,17 @@ class H5Proxy:
else:
return obj.dtype[self.field]
def __array__(self) -> np.ndarray:
"""To a numpy array"""
with h5py.File(self.file, "r") as h5f:
obj = h5f.get(self.path)
return obj[:]
def __getattr__(self, item: str):
with h5py.File(self.file, "r") as h5f:
obj = h5f.get(self.path)
return getattr(obj, item)
val = getattr(obj, item)
return val
def __getitem__(
self, item: Union[int, slice, Tuple[Union[int, slice], ...]]

View file

@ -137,6 +137,10 @@ class VideoProxy:
slice_ = slice(0, slice_.stop, slice_.step)
return slice_
def __array__(self) -> np.ndarray:
"""Whole video as a numpy array"""
return self[:]
def __getitem__(self, item: Union[int, slice, tuple]) -> np.ndarray:
if isinstance(item, int):
# want a single frame

View file

@ -1,6 +1,6 @@
import pytest
from typing import Tuple, Callable
from typing import Callable, Tuple, Type
import numpy as np
import dask.array as da
import zarr
@ -32,7 +32,7 @@ from numpydantic import interface, NDArray
"video",
],
)
def interface_type(request) -> Tuple[NDArray, interface.Interface]:
def interface_type(request) -> Tuple[NDArray, Type[interface.Interface]]:
"""
Test cases for each interface's ``check`` method - each input should match the
provided interface and that interface only

View file

@ -2,6 +2,10 @@
Tests that should be applied to all interfaces
"""
from typing import Callable
import numpy as np
from numpydantic.interface import Interface
def test_interface_revalidate(all_interfaces):
"""
@ -10,3 +14,29 @@ def test_interface_revalidate(all_interfaces):
See: https://github.com/p2p-ld/numpydantic/pull/14
"""
_ = type(all_interfaces)(array=all_interfaces.array)
def test_interface_rematch(interface_type):
"""
All interfaces should match the results of the object they return after validation
"""
array, interface = interface_type
if isinstance(array, Callable):
array = array()
assert Interface.match(interface().validate(array)) is interface
def test_interface_to_numpy_array(all_interfaces):
"""
All interfaces should be able to have the output of their validation stage
coerced to a numpy array with np.array()
"""
_ = np.array(all_interfaces.array)
def test_interface_dump_json(all_interfaces):
"""
All interfaces should be able to dump to json
"""
all_interfaces.model_dump_json()