Skip to content

Commit 7f8bf70

Browse files
committed
fix mac os x doctest
1 parent bb53eca commit 7f8bf70

2 files changed

Lines changed: 32 additions & 20 deletions

File tree

conftest.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import builtins
2+
import os
3+
import re
4+
import unittest.mock
5+
6+
7+
def dyld_find_mock(lib_filename):
8+
# https://github.com/python/cpython/blob/master/Lib/ctypes/macholib/dyld.py#L116
9+
lib_name = re.match(r'^(lib\w+)\.\w+(\.\d+)?$', lib_filename).group(1)
10+
return os.path.join(os.sep, 'usr', 'lib', lib_name + '.dylib')
11+
12+
_BUILTIN_IMPORT = builtins.__import__
13+
14+
def import_mock(name, *args, **kwargs):
15+
try:
16+
return _BUILTIN_IMPORT(name, *args, **kwargs)
17+
except ModuleNotFoundError as exc:
18+
if name == 'ctypes.macholib.dyld': # only available on mac
19+
dyld_module = unittest.mock.MagicMock()
20+
dyld_module.dyld_find = dyld_find_mock
21+
return dyld_module
22+
raise exc
23+
24+
# required for tests/dlinfo_macosx_mock_test.py and doctests in dlinfo/_macosx.py.
25+
# @pytest.fixture(autouse=True) does not run before import statements.
26+
builtins.__import__ = import_mock

tests/dlinfo_macosx_mock_test.py

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import builtins
21
import ctypes
32
import ctypes.util
43
import importlib
@@ -10,28 +9,12 @@
109

1110
import dlinfo
1211

13-
BUILTIN_IMPORT = builtins.__import__
14-
15-
16-
def dyld_find_mock(name):
17-
# https://github.com/python/cpython/blob/master/Lib/ctypes/macholib/dyld.py#L116
18-
return os.path.join(os.sep, 'lib', name)
19-
20-
21-
def import_mock(name, *args):
22-
if name == 'ctypes.macholib.dyld':
23-
dyld_module = unittest.mock.MagicMock()
24-
dyld_module.dyld_find = dyld_find_mock
25-
return dyld_module
26-
return BUILTIN_IMPORT(name, *args)
27-
2812

2913
# pylint: disable=redefined-outer-name
3014
@pytest.fixture
3115
def dlinfo_module_mac() -> types.ModuleType:
3216
with unittest.mock.patch('sys.platform', 'darwin'):
33-
with unittest.mock.patch('builtins.__import__', import_mock):
34-
dlinfo_module = importlib.reload(dlinfo)
17+
dlinfo_module = importlib.reload(dlinfo)
3518
assert dlinfo_module.DLInfo.__module__ == 'dlinfo._macosx'
3619
return dlinfo_module
3720

@@ -48,5 +31,8 @@ def test_dlinfo_path(dlinfo_module_mac, lib_name):
4831
pytest.xfail('lib{} not found'.format(lib_name))
4932
lib = ctypes.cdll.LoadLibrary(lib_filename)
5033
lib_info = dlinfo_module_mac.DLInfo(lib)
51-
assert lib_filename == os.path.basename(lib_info.path)
52-
assert os.path.join(os.sep, 'lib') == os.path.dirname(lib_info.path)
34+
if os.path.exists(lib_info.path): # mac
35+
assert os.path.isabs(lib_info.path)
36+
assert lib_filename == os.path.basename(lib_info.path)
37+
else: # dyld_find mock
38+
assert lib_info.path == '/usr/lib/lib{}.dylib'.format(lib_name)

0 commit comments

Comments
 (0)