Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions obstore/python/obstore/fsspec.py
Original file line number Diff line number Diff line change
Expand Up @@ -571,6 +571,8 @@ async def _ls(
"size": obj["size"],
"type": "file",
"e_tag": obj["e_tag"],
"last_modified": obj["last_modified"],
"version": obj["version"],
}
for obj in objects
] + [
Expand Down
27 changes: 27 additions & 0 deletions tests/test_fsspec.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import gc
import os
import zipfile
from datetime import datetime, timedelta
from io import UnsupportedOperation
from pathlib import Path
from tempfile import TemporaryDirectory
Expand Down Expand Up @@ -417,6 +418,32 @@ def test_list(
assert types.get(f"{bucket}/dir") == "directory"


def test_list_detail_matches_info(
minio_bucket: tuple[S3Config, ClientConfig],
):
bucket = minio_bucket[0].get("bucket")
assert bucket is not None

register("s3")
fs = fsspec.filesystem(
"s3",
config=minio_bucket[0],
client_options=minio_bucket[1],
)

fs.pipe_file(f"{bucket}/afile", b"hello world")

out = fs.ls(f"{bucket}", detail=True, refresh=True)
entry = next(o for o in out if o["name"] == f"{bucket}/afile")
# Without the listing in the cache, info() asks the store itself (HEAD).
fs.invalidate_cache()
info = fs.info(f"{bucket}/afile")
assert isinstance(entry["last_modified"], datetime)
# A listing reports milliseconds; HEAD's Last-Modified header whole seconds.
assert abs(entry["last_modified"] - info["last_modified"]) < timedelta(seconds=1)
assert entry["version"] == info["version"]


@pytest.mark.asyncio
async def test_list_async(
minio_bucket: tuple[S3Config, ClientConfig],
Expand Down
Loading