12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- import importlib
- import sys
- import types
- import pytest
- import networkx.lazy_imports as lazy
- def test_lazy_import_basics():
- math = lazy._lazy_import("math")
- anything_not_real = lazy._lazy_import("anything_not_real")
- # Now test that accessing attributes does what it should
- assert math.sin(math.pi) == pytest.approx(0, 1e-6)
- # poor-mans pytest.raises for testing errors on attribute access
- try:
- anything_not_real.pi
- assert False # Should not get here
- except ModuleNotFoundError:
- pass
- assert isinstance(anything_not_real, lazy.DelayedImportErrorModule)
- # see if it changes for second access
- try:
- anything_not_real.pi
- assert False # Should not get here
- except ModuleNotFoundError:
- pass
- def test_lazy_import_impact_on_sys_modules():
- math = lazy._lazy_import("math")
- anything_not_real = lazy._lazy_import("anything_not_real")
- assert type(math) == types.ModuleType
- assert "math" in sys.modules
- assert type(anything_not_real) == lazy.DelayedImportErrorModule
- assert "anything_not_real" not in sys.modules
- # only do this if numpy is installed
- np_test = pytest.importorskip("numpy")
- np = lazy._lazy_import("numpy")
- assert type(np) == types.ModuleType
- assert "numpy" in sys.modules
- np.pi # trigger load of numpy
- assert type(np) == types.ModuleType
- assert "numpy" in sys.modules
- def test_lazy_import_nonbuiltins():
- sp = lazy._lazy_import("scipy")
- np = lazy._lazy_import("numpy")
- if isinstance(sp, lazy.DelayedImportErrorModule):
- try:
- sp.pi
- assert False
- except ModuleNotFoundError:
- pass
- elif isinstance(np, lazy.DelayedImportErrorModule):
- try:
- np.sin(np.pi)
- assert False
- except ModuleNotFoundError:
- pass
- else:
- assert np.sin(sp.pi) == pytest.approx(0, 1e-6)
- def test_lazy_attach():
- name = "mymod"
- submods = ["mysubmodule", "anothersubmodule"]
- myall = {"not_real_submod": ["some_var_or_func"]}
- locls = {
- "attach": lazy.attach,
- "name": name,
- "submods": submods,
- "myall": myall,
- }
- s = "__getattr__, __lazy_dir__, __all__ = attach(name, submods, myall)"
- exec(s, {}, locls)
- expected = {
- "attach": lazy.attach,
- "name": name,
- "submods": submods,
- "myall": myall,
- "__getattr__": None,
- "__lazy_dir__": None,
- "__all__": None,
- }
- assert locls.keys() == expected.keys()
- for k, v in expected.items():
- if v is not None:
- assert locls[k] == v
|