Traktor/myenv/Lib/site-packages/fsspec/implementations/tests/test_zip.py

135 lines
3.8 KiB
Python
Raw Normal View History

2024-05-23 01:57:24 +02:00
import collections.abc
import os.path
import pytest
import fsspec
from fsspec.implementations.tests.test_archive import archive_data, tempzip
def test_info():
with tempzip(archive_data) as z:
fs = fsspec.filesystem("zip", fo=z)
# Iterate over all files.
for f in archive_data:
lhs = fs.info(f)
# Probe some specific fields of Zip archives.
assert "CRC" in lhs
assert "compress_size" in lhs
def test_fsspec_get_mapper():
"""Added for #788"""
with tempzip(archive_data) as z:
mapping = fsspec.get_mapper(f"zip::{z}")
assert isinstance(mapping, collections.abc.Mapping)
keys = sorted(mapping.keys())
assert keys == ["a", "b", "deeply/nested/path"]
# mapping.getitems() will call FSMap.fs.cat()
# which was not accurately implemented for zip.
assert isinstance(mapping, fsspec.mapping.FSMap)
items = dict(mapping.getitems(keys))
assert items == {"a": b"", "b": b"hello", "deeply/nested/path": b"stuff"}
def test_not_cached():
with tempzip(archive_data) as z:
fs = fsspec.filesystem("zip", fo=z)
fs2 = fsspec.filesystem("zip", fo=z)
assert fs is not fs2
def test_root_info():
with tempzip(archive_data) as z:
fs = fsspec.filesystem("zip", fo=z)
assert fs.info("/") == {"name": "", "type": "directory", "size": 0}
assert fs.info("") == {"name": "", "type": "directory", "size": 0}
def test_write_seek(m):
with m.open("afile.zip", "wb") as f:
fs = fsspec.filesystem("zip", fo=f, mode="w")
fs.pipe("another", b"hi")
fs.zip.close()
with m.open("afile.zip", "rb") as f:
fs = fsspec.filesystem("zip", fo=f)
assert fs.cat("another") == b"hi"
def test_rw(m):
# extra arg to zip means "create archive"
with fsspec.open(
"zip://afile::memory://out.zip", mode="wb", zip={"mode": "w"}
) as f:
f.write(b"data")
with fsspec.open("zip://afile::memory://out.zip", mode="rb") as f:
assert f.read() == b"data"
def test_mapper(m):
# extra arg to zip means "create archive"
mapper = fsspec.get_mapper("zip::memory://out.zip", zip={"mode": "w"})
with pytest.raises(KeyError):
mapper["a"]
mapper["a"] = b"data"
with pytest.raises(OSError):
# fails because this is write mode and we cannot also read
mapper["a"]
assert "a" in mapper # but be can list
def test_zip_glob_star(m):
with fsspec.open(
"zip://adir/afile::memory://out.zip", mode="wb", zip={"mode": "w"}
) as f:
f.write(b"data")
fs, _ = fsspec.core.url_to_fs("zip::memory://out.zip")
outfiles = fs.glob("*")
assert len(outfiles) == 1
fs = fsspec.filesystem("zip", fo="memory://out.zip", mode="w")
fs.mkdir("adir")
fs.pipe("adir/afile", b"data")
outfiles = fs.glob("*")
assert len(outfiles) == 1
fn = f"{os.path.dirname(os.path.abspath((__file__)))}/out.zip"
fs = fsspec.filesystem("zip", fo=fn, mode="r")
outfiles = fs.glob("*")
assert len(outfiles) == 1
def test_append(m, tmpdir):
fs = fsspec.filesystem("zip", fo="memory://out.zip", mode="w")
with fs.open("afile", "wb") as f:
f.write(b"data")
fs.close()
fs = fsspec.filesystem("zip", fo="memory://out.zip", mode="a")
with fs.open("bfile", "wb") as f:
f.write(b"data")
fs.close()
assert len(fsspec.open_files("zip://*::memory://out.zip")) == 2
fs = fsspec.filesystem("zip", fo=f"{tmpdir}/out.zip", mode="w")
with fs.open("afile", "wb") as f:
f.write(b"data")
fs.close()
fs = fsspec.filesystem("zip", fo=f"{tmpdir}/out.zip", mode="a")
with fs.open("bfile", "wb") as f:
f.write(b"data")
fs.close()
assert len(fsspec.open_files("zip://*::memory://out.zip")) == 2