Skip to content

Commit 463e2ce

Browse files
authored
allow ReferenceFileSystem to hold dicts, which are treated as JSON files (#1562)
1 parent 59a2d64 commit 463e2ce

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

fsspec/implementations/reference.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -935,6 +935,10 @@ def _process_references(self, references, template_overrides=None):
935935

936936
def _process_references0(self, references):
937937
"""Make reference dict for Spec Version 0"""
938+
references = {
939+
key: json.dumps(val) if isinstance(val, dict) else val
940+
for key, val in references.items()
941+
}
938942
self.references = references
939943

940944
def _process_references1(self, references, template_overrides=None):
@@ -964,6 +968,8 @@ def _render_jinja(u):
964968
else:
965969
u = _render_jinja(u)
966970
self.references[k] = [u] if len(v) == 1 else [u, v[1], v[2]]
971+
elif isinstance(v, dict):
972+
self.references[k] = json.dumps(v)
967973
else:
968974
self.references[k] = v
969975
self.references.update(self._process_gen(references.get("gen", [])))

fsspec/implementations/tests/test_reference.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def test_simple(server): # noqa: F811
1919
"b": (realfile, 0, 5),
2020
"c": (realfile, 1, 5),
2121
"d": b"base64:aGVsbG8=",
22+
"e": {"key": "value"},
2223
}
2324
h = fsspec.filesystem("http")
2425
fs = fsspec.filesystem("reference", fo=refs, fs=h)
@@ -27,6 +28,30 @@ def test_simple(server): # noqa: F811
2728
assert fs.cat("b") == data[:5]
2829
assert fs.cat("c") == data[1 : 1 + 5]
2930
assert fs.cat("d") == b"hello"
31+
assert fs.cat("e") == b'{"key": "value"}'
32+
with fs.open("d", "rt") as f:
33+
assert f.read(2) == "he"
34+
35+
36+
def test_simple_ver1(server): # noqa: F811
37+
in_data = {
38+
"version": 1,
39+
"refs": {
40+
"a": b"data",
41+
"b": (realfile, 0, 5),
42+
"c": (realfile, 1, 5),
43+
"d": b"base64:aGVsbG8=",
44+
"e": {"key": "value"},
45+
},
46+
}
47+
h = fsspec.filesystem("http")
48+
fs = fsspec.filesystem("reference", fo=in_data, fs=h)
49+
50+
assert fs.cat("a") == b"data"
51+
assert fs.cat("b") == data[:5]
52+
assert fs.cat("c") == data[1 : 1 + 5]
53+
assert fs.cat("d") == b"hello"
54+
assert fs.cat("e") == b'{"key": "value"}'
3055
with fs.open("d", "rt") as f:
3156
assert f.read(2) == "he"
3257

0 commit comments

Comments
 (0)