Spaces:
Sleeping
Sleeping
| import os | |
| import pytest | |
| import shutil | |
| import subprocess | |
| import sys | |
| import warnings | |
| import numpy as np | |
| try: | |
| import cffi | |
| except ImportError: | |
| cffi = None | |
| if sys.flags.optimize > 1: | |
| # no docstrings present to inspect when PYTHONOPTIMIZE/Py_OptimizeFlag > 1 | |
| # cffi cannot succeed | |
| cffi = None | |
| try: | |
| with warnings.catch_warnings(record=True) as w: | |
| # numba issue gh-4733 | |
| warnings.filterwarnings('always', '', DeprecationWarning) | |
| import numba | |
| except ImportError: | |
| numba = None | |
| try: | |
| import cython | |
| from Cython.Compiler.Version import version as cython_version | |
| except ImportError: | |
| cython = None | |
| else: | |
| from distutils.version import LooseVersion | |
| # Cython 0.29.21 is required for Python 3.9 and there are | |
| # other fixes in the 0.29 series that are needed even for earlier | |
| # Python versions. | |
| # Note: keep in sync with the one in pyproject.toml | |
| required_version = LooseVersion('0.29.21') | |
| if LooseVersion(cython_version) < required_version: | |
| # too old or wrong cython, skip the test | |
| cython = None | |
| def test_cython(tmp_path): | |
| srcdir = os.path.join(os.path.dirname(__file__), '..') | |
| shutil.copytree(srcdir, tmp_path / 'random') | |
| # build the examples and "install" them into a temporary directory | |
| build_dir = tmp_path / 'random' / '_examples' / 'cython' | |
| subprocess.check_call([sys.executable, 'setup.py', 'build', 'install', | |
| '--prefix', str(tmp_path / 'installdir'), | |
| '--single-version-externally-managed', | |
| '--record', str(tmp_path/ 'tmp_install_log.txt'), | |
| ], | |
| cwd=str(build_dir), | |
| ) | |
| # gh-16162: make sure numpy's __init__.pxd was used for cython | |
| # not really part of this test, but it is a convenient place to check | |
| with open(build_dir / 'extending.c') as fid: | |
| txt_to_find = 'NumPy API declarations from "numpy/__init__.pxd"' | |
| for i, line in enumerate(fid): | |
| if txt_to_find in line: | |
| break | |
| else: | |
| assert False, ("Could not find '{}' in C file, " | |
| "wrong pxd used".format(txt_to_find)) | |
| # get the path to the so's | |
| so1 = so2 = None | |
| with open(tmp_path /'tmp_install_log.txt') as fid: | |
| for line in fid: | |
| if 'extending.' in line: | |
| so1 = line.strip() | |
| if 'extending_distributions' in line: | |
| so2 = line.strip() | |
| assert so1 is not None | |
| assert so2 is not None | |
| # import the so's without adding the directory to sys.path | |
| from importlib.machinery import ExtensionFileLoader | |
| extending = ExtensionFileLoader('extending', so1).load_module() | |
| extending_distributions = ExtensionFileLoader('extending_distributions', so2).load_module() | |
| # actually test the cython c-extension | |
| from numpy.random import PCG64 | |
| values = extending_distributions.uniforms_ex(PCG64(0), 10, 'd') | |
| assert values.shape == (10,) | |
| assert values.dtype == np.float64 | |
| def test_numba(): | |
| from numpy.random._examples.numba import extending # noqa: F401 | |
| def test_cffi(): | |
| from numpy.random._examples.cffi import extending # noqa: F401 | |