test_public_api.py 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. from __future__ import division, absolute_import, print_function
  2. import sys
  3. import numpy as np
  4. import pytest
  5. try:
  6. import ctypes
  7. except ImportError:
  8. ctypes = None
  9. def check_dir(module, module_name=None):
  10. """Returns a mapping of all objects with the wrong __module__ attribute."""
  11. if module_name is None:
  12. module_name = module.__name__
  13. results = {}
  14. for name in dir(module):
  15. item = getattr(module, name)
  16. if (hasattr(item, '__module__') and hasattr(item, '__name__')
  17. and item.__module__ != module_name):
  18. results[name] = item.__module__ + '.' + item.__name__
  19. return results
  20. @pytest.mark.skipif(
  21. sys.version_info[0] < 3,
  22. reason="NumPy exposes slightly different functions on Python 2")
  23. def test_numpy_namespace():
  24. # None of these objects are publicly documented.
  25. undocumented = {
  26. 'Tester': 'numpy.testing._private.nosetester.NoseTester',
  27. '_add_newdoc_ufunc': 'numpy.core._multiarray_umath._add_newdoc_ufunc',
  28. 'add_docstring': 'numpy.core._multiarray_umath.add_docstring',
  29. 'add_newdoc': 'numpy.core.function_base.add_newdoc',
  30. 'add_newdoc_ufunc': 'numpy.core._multiarray_umath._add_newdoc_ufunc',
  31. 'byte_bounds': 'numpy.lib.utils.byte_bounds',
  32. 'compare_chararrays': 'numpy.core._multiarray_umath.compare_chararrays',
  33. 'deprecate': 'numpy.lib.utils.deprecate',
  34. 'deprecate_with_doc': 'numpy.lib.utils.<lambda>',
  35. 'disp': 'numpy.lib.function_base.disp',
  36. 'fastCopyAndTranspose': 'numpy.core._multiarray_umath._fastCopyAndTranspose',
  37. 'get_array_wrap': 'numpy.lib.shape_base.get_array_wrap',
  38. 'get_include': 'numpy.lib.utils.get_include',
  39. 'int_asbuffer': 'numpy.core._multiarray_umath.int_asbuffer',
  40. 'mafromtxt': 'numpy.lib.npyio.mafromtxt',
  41. 'maximum_sctype': 'numpy.core.numerictypes.maximum_sctype',
  42. 'ndfromtxt': 'numpy.lib.npyio.ndfromtxt',
  43. 'recfromcsv': 'numpy.lib.npyio.recfromcsv',
  44. 'recfromtxt': 'numpy.lib.npyio.recfromtxt',
  45. 'safe_eval': 'numpy.lib.utils.safe_eval',
  46. 'set_string_function': 'numpy.core.arrayprint.set_string_function',
  47. 'show_config': 'numpy.__config__.show',
  48. 'who': 'numpy.lib.utils.who',
  49. }
  50. # These built-in types are re-exported by numpy.
  51. builtins = {
  52. 'bool': 'builtins.bool',
  53. 'complex': 'builtins.complex',
  54. 'float': 'builtins.float',
  55. 'int': 'builtins.int',
  56. 'long': 'builtins.int',
  57. 'object': 'builtins.object',
  58. 'str': 'builtins.str',
  59. 'unicode': 'builtins.str',
  60. }
  61. whitelist = dict(undocumented, **builtins)
  62. bad_results = check_dir(np)
  63. # pytest gives better error messages with the builtin assert than with
  64. # assert_equal
  65. assert bad_results == whitelist
  66. def test_numpy_linalg():
  67. bad_results = check_dir(np.linalg)
  68. assert bad_results == {}
  69. def test_numpy_fft():
  70. bad_results = check_dir(np.fft)
  71. assert bad_results == {}
  72. @pytest.mark.skipif(ctypes is None,
  73. reason="ctypes not available in this python")
  74. def test_NPY_NO_EXPORT():
  75. cdll = ctypes.CDLL(np.core._multiarray_tests.__file__)
  76. # Make sure an arbitrary NPY_NO_EXPORT function is actually hidden
  77. f = getattr(cdll, 'test_not_exported', None)
  78. assert f is None, ("'test_not_exported' is mistakenly exported, "
  79. "NPY_NO_EXPORT does not work")