135 lines
4.1 KiB
Python
135 lines
4.1 KiB
Python
|
import sys
|
||
|
from importlib.metadata import EntryPoint
|
||
|
from unittest.mock import create_autospec, patch
|
||
|
|
||
|
import pytest
|
||
|
|
||
|
import fsspec
|
||
|
from fsspec.implementations.zip import ZipFileSystem
|
||
|
from fsspec.registry import (
|
||
|
_registry,
|
||
|
filesystem,
|
||
|
get_filesystem_class,
|
||
|
known_implementations,
|
||
|
register_implementation,
|
||
|
registry,
|
||
|
)
|
||
|
from fsspec.spec import AbstractFileSystem
|
||
|
|
||
|
|
||
|
@pytest.fixture()
|
||
|
def clear_registry():
|
||
|
try:
|
||
|
yield
|
||
|
finally:
|
||
|
_registry.clear()
|
||
|
known_implementations.pop("test", None)
|
||
|
|
||
|
|
||
|
@pytest.fixture()
|
||
|
def clean_imports():
|
||
|
try:
|
||
|
real_module = sys.modules["fsspec"]
|
||
|
del sys.modules["fsspec"]
|
||
|
yield
|
||
|
finally:
|
||
|
sys.modules["fsspec"] = real_module
|
||
|
|
||
|
|
||
|
def test_registry_readonly():
|
||
|
get_filesystem_class("file")
|
||
|
assert "file" in registry
|
||
|
assert "file" in list(registry)
|
||
|
with pytest.raises(TypeError):
|
||
|
del registry["file"]
|
||
|
with pytest.raises(TypeError):
|
||
|
registry["file"] = None
|
||
|
with pytest.raises(AttributeError):
|
||
|
registry.clear()
|
||
|
|
||
|
|
||
|
def test_register_cls(clear_registry):
|
||
|
with pytest.raises(ValueError):
|
||
|
get_filesystem_class("test")
|
||
|
register_implementation("test", AbstractFileSystem)
|
||
|
cls = get_filesystem_class("test")
|
||
|
assert cls is AbstractFileSystem
|
||
|
|
||
|
|
||
|
def test_register_str(clear_registry):
|
||
|
with pytest.raises(ValueError):
|
||
|
get_filesystem_class("test")
|
||
|
register_implementation("test", "fsspec.AbstractFileSystem")
|
||
|
assert "test" not in registry
|
||
|
cls = get_filesystem_class("test")
|
||
|
assert cls is AbstractFileSystem
|
||
|
assert "test" in registry
|
||
|
|
||
|
|
||
|
def test_register_fail(clear_registry):
|
||
|
register_implementation("test", "doesntexist.AbstractFileSystem")
|
||
|
with pytest.raises(ImportError):
|
||
|
get_filesystem_class("test")
|
||
|
|
||
|
# NOOP
|
||
|
register_implementation("test", "doesntexist.AbstractFileSystem", clobber=False)
|
||
|
with pytest.raises(ValueError):
|
||
|
register_implementation(
|
||
|
"test", "doesntexist.AbstractFileSystemm", clobber=False
|
||
|
)
|
||
|
|
||
|
# by default we do not allow clobbering
|
||
|
with pytest.raises(ValueError):
|
||
|
register_implementation("test", "doesntexist.AbstractFileSystemm")
|
||
|
|
||
|
register_implementation(
|
||
|
"test", "doesntexist.AbstractFileSystem", errtxt="hiho", clobber=True
|
||
|
)
|
||
|
with pytest.raises(ImportError) as e:
|
||
|
get_filesystem_class("test")
|
||
|
assert "hiho" in str(e.value)
|
||
|
register_implementation("test", AbstractFileSystem)
|
||
|
|
||
|
# NOOP
|
||
|
register_implementation("test", AbstractFileSystem)
|
||
|
with pytest.raises(ValueError):
|
||
|
register_implementation("test", ZipFileSystem)
|
||
|
register_implementation("test", AbstractFileSystem, clobber=True)
|
||
|
assert isinstance(fsspec.filesystem("test"), AbstractFileSystem)
|
||
|
|
||
|
|
||
|
def test_entry_points_registered_on_import(clear_registry, clean_imports):
|
||
|
mock_ep = create_autospec(EntryPoint, module="fsspec.spec.AbstractFileSystem")
|
||
|
mock_ep.name = "test" # this can't be set in the constructor...
|
||
|
mock_ep.value = "fsspec.spec.AbstractFileSystem"
|
||
|
import_location = "importlib.metadata.entry_points"
|
||
|
with patch(import_location, return_value={"fsspec.specs": [mock_ep]}):
|
||
|
assert "test" not in registry
|
||
|
import fsspec # noqa
|
||
|
|
||
|
get_filesystem_class("test")
|
||
|
assert "test" in registry
|
||
|
|
||
|
|
||
|
def test_filesystem_warning_arrow_hdfs_deprecated(clear_registry, clean_imports):
|
||
|
mock_ep = create_autospec(EntryPoint, module="fsspec.spec.AbstractFileSystem")
|
||
|
mock_ep.name = "arrow_hdfs" # this can't be set in the constructor...
|
||
|
mock_ep.value = "fsspec.spec.AbstractFileSystem"
|
||
|
import_location = "importlib.metadata.entry_points"
|
||
|
with patch(import_location, return_value={"fsspec.specs": [mock_ep]}):
|
||
|
import fsspec # noqa
|
||
|
|
||
|
with pytest.warns(DeprecationWarning):
|
||
|
filesystem("arrow_hdfs")
|
||
|
|
||
|
|
||
|
def test_old_s3(monkeypatch):
|
||
|
from fsspec.registry import _import_class
|
||
|
|
||
|
s3fs = pytest.importorskip("s3fs")
|
||
|
monkeypatch.setattr(s3fs, "__version__", "0.4.2")
|
||
|
with pytest.warns():
|
||
|
_import_class("s3fs:S3FileSystem")
|
||
|
with pytest.warns():
|
||
|
_import_class("s3fs.S3FileSystem")
|