Skip to content

Commit a85c4c2

Browse files
authored
Fix on_error="omit" for cat via caching (#1202)
1 parent 7c192d8 commit a85c4c2

File tree

2 files changed

+43
-10
lines changed

2 files changed

+43
-10
lines changed

fsspec/implementations/cached.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -614,20 +614,28 @@ def cat(
614614
getpaths = []
615615
storepaths = []
616616
fns = []
617-
for p in paths:
618-
detail = self._check_file(p)
619-
if not detail:
620-
fn = self._make_local_details(p)
621-
getpaths.append(p)
622-
storepaths.append(fn)
623-
else:
624-
detail, fn = detail if isinstance(detail, tuple) else (None, detail)
625-
fns.append(fn)
617+
out = {}
618+
for p in paths.copy():
619+
try:
620+
detail = self._check_file(p)
621+
if not detail:
622+
fn = self._make_local_details(p)
623+
getpaths.append(p)
624+
storepaths.append(fn)
625+
else:
626+
detail, fn = detail if isinstance(detail, tuple) else (None, detail)
627+
fns.append(fn)
628+
except Exception as e:
629+
if on_error == "raise":
630+
raise
631+
if on_error == "return":
632+
out[p] = e
633+
paths.remove(p)
634+
626635
if getpaths:
627636
self.fs.get(getpaths, storepaths)
628637
self.save_cache()
629638

630-
out = {}
631639
callback.set_size(len(paths))
632640
for p, fn in zip(paths, fns):
633641
with open(fn, "rb") as f:

fsspec/implementations/tests/test_cached.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -924,3 +924,28 @@ def test_str():
924924
lfs = LocalFileSystem()
925925
cfs = CachingFileSystem(fs=lfs)
926926
assert "CachingFileSystem" in str(cfs)
927+
928+
929+
def test_getitems_errors(tmpdir):
930+
tmpdir = str(tmpdir)
931+
os.makedirs(os.path.join(tmpdir, "afolder"))
932+
open(os.path.join(tmpdir, "afile"), "w").write("test")
933+
open(os.path.join(tmpdir, "afolder", "anotherfile"), "w").write("test2")
934+
m = fsspec.get_mapper("file://" + tmpdir)
935+
assert m.getitems(["afile", "bfile"], on_error="omit") == {"afile": b"test"}
936+
937+
# my code
938+
m2 = fsspec.get_mapper("simplecache::file://" + tmpdir)
939+
assert m2.getitems(["afile"], on_error="omit") == {"afile": b"test"} # works
940+
assert m2.getitems(["afile", "bfile"], on_error="omit") == {
941+
"afile": b"test"
942+
} # throws KeyError
943+
944+
with pytest.raises(KeyError):
945+
m.getitems(["afile", "bfile"])
946+
out = m.getitems(["afile", "bfile"], on_error="return")
947+
assert isinstance(out["bfile"], KeyError)
948+
m = fsspec.get_mapper("file://" + tmpdir, missing_exceptions=())
949+
assert m.getitems(["afile", "bfile"], on_error="omit") == {"afile": b"test"}
950+
with pytest.raises(FileNotFoundError):
951+
m.getitems(["afile", "bfile"])

0 commit comments

Comments
 (0)