Traktor/myenv/Lib/site-packages/fsspec/tests/test_registry.py
2024-05-26 05:12:46 +02:00

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")