test_optional_dependency.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import sys
  2. import types
  3. import pytest
  4. from pandas.compat._optional import VERSIONS, import_optional_dependency
  5. import pandas._testing as tm
  6. def test_import_optional():
  7. match = "Missing .*notapackage.* pip .* conda .* notapackage"
  8. with pytest.raises(ImportError, match=match):
  9. import_optional_dependency("notapackage")
  10. result = import_optional_dependency("notapackage", raise_on_missing=False)
  11. assert result is None
  12. def test_xlrd_version_fallback():
  13. pytest.importorskip("xlrd")
  14. import_optional_dependency("xlrd")
  15. def test_bad_version():
  16. name = "fakemodule"
  17. module = types.ModuleType(name)
  18. module.__version__ = "0.9.0"
  19. sys.modules[name] = module
  20. VERSIONS[name] = "1.0.0"
  21. match = "Pandas requires .*1.0.0.* of .fakemodule.*'0.9.0'"
  22. with pytest.raises(ImportError, match=match):
  23. import_optional_dependency("fakemodule")
  24. with tm.assert_produces_warning(UserWarning):
  25. result = import_optional_dependency("fakemodule", on_version="warn")
  26. assert result is None
  27. module.__version__ = "1.0.0" # exact match is OK
  28. result = import_optional_dependency("fakemodule")
  29. assert result is module
  30. def test_no_version_raises():
  31. name = "fakemodule"
  32. module = types.ModuleType(name)
  33. sys.modules[name] = module
  34. VERSIONS[name] = "1.0.0"
  35. with pytest.raises(ImportError, match="Can't determine .* fakemodule"):
  36. import_optional_dependency(name)