diff --git a/src/array_api_extra/_delegation.py b/src/array_api_extra/_delegation.py index d95e9fd3..01a57f63 100644 --- a/src/array_api_extra/_delegation.py +++ b/src/array_api_extra/_delegation.py @@ -24,6 +24,7 @@ from ._lib._utils._typing import Array, Device, DType __all__ = [ + "argpartition", "atleast_nd", "broadcast_shapes", "cov", @@ -31,14 +32,18 @@ "diag_indices", "expand_dims", "isclose", + "isin", "kron", "nan_to_num", "one_hot", "pad", + "partition", "searchsorted", + "setdiff1d", "sinc", "tril_indices", "triu_indices", + "union1d", "unravel_index", ] diff --git a/src/array_api_extra/_lib/_funcs.py b/src/array_api_extra/_lib/_funcs.py index f2e27a43..4b8a7ce7 100644 --- a/src/array_api_extra/_lib/_funcs.py +++ b/src/array_api_extra/_lib/_funcs.py @@ -26,20 +26,29 @@ __all__ = [ "angle", "apply_where", + "argpartition", "atleast_nd", "broadcast_shapes", "cov", "create_diagonal", + "default_dtype", "diag_indices", "expand_dims", + "isclose", + "isin", "kron", + "nan_to_num", "nunique", + "one_hot", "pad", + "partition", "searchsorted", "setdiff1d", "sinc", "tril_indices", "triu_indices", + "union1d", + "unravel_index", ] diff --git a/tests/test_funcs.py b/tests/test_funcs.py index 498269b5..5e3af6e6 100644 --- a/tests/test_funcs.py +++ b/tests/test_funcs.py @@ -1,3 +1,4 @@ +import inspect import math import warnings from collections.abc import Callable @@ -12,6 +13,7 @@ from hypothesis import strategies as st from typing_extensions import override +import array_api_extra._delegation as delegated_func from array_api_extra import ( angle, apply_where, @@ -42,6 +44,7 @@ from array_api_extra import ( searchsorted as xpx_searchsorted, ) +from array_api_extra._lib import _funcs as functions from array_api_extra._lib._backends import NUMPY_VERSION, Backend from array_api_extra._lib._funcs import searchsorted as _funcs_searchsorted from array_api_extra._lib._utils._compat import ( @@ -80,6 +83,29 @@ lazy_xp_function(_funcs_searchsorted) +def test_all_contains_all_public_functions(): + public_functions = { + name + for name, obj in inspect.getmembers(functions, inspect.isfunction) + if not name.startswith("_") and obj.__module__ == functions.__name__ + } + missing = sorted(public_functions - set(functions.__all__)) + extra = sorted(set(functions.__all__) - public_functions) + assert public_functions == set(functions.__all__), ( + f"Missing from __all__: {missing}\tExtra in __all__: {extra}" + ) + public_functions = { + name + for name, obj in inspect.getmembers(delegated_func, inspect.isfunction) + if not name.startswith("_") and obj.__module__ == delegated_func.__name__ + } + missing = sorted(public_functions - set(delegated_func.__all__)) + extra = sorted(set(delegated_func.__all__) - public_functions) + assert public_functions == set(delegated_func.__all__), ( + f"Missing from __all__: {missing}\tExtra in __all__: {extra}" + ) + + class TestApplyWhere: @staticmethod def f1(x: Array, y: Array | int = 10) -> Array: