Skip to content

Commit

Permalink
Merge pull request #743 from nipype/mock-bytes-repr
Browse files Browse the repository at this point in the history
Special handling of bytes_repr for mock filesets
  • Loading branch information
effigies authored May 30, 2024
2 parents 873f8a0 + dd6fa8a commit ce10332
Showing 1 changed file with 21 additions and 3 deletions.
24 changes: 21 additions & 3 deletions pydra/utils/hash.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
)
from filelock import SoftFileLock
import attrs.exceptions
from fileformats.core import FileSet
from fileformats.core.fileset import FileSet, MockMixin
from . import user_cache_dir, add_exc_note

logger = logging.getLogger("pydra")
Expand Down Expand Up @@ -55,7 +55,7 @@
)

Hash = NewType("Hash", bytes)
CacheKey = NewType("CacheKey", ty.Tuple[ty.Hashable, ty.Hashable])
CacheKey = NewType("CacheKey", ty.Tuple[ty.Hashable, ...])


def location_converter(path: ty.Union[Path, str, None]) -> Path:
Expand Down Expand Up @@ -478,11 +478,29 @@ def bytes_repr_fileset(
fileset: FileSet, cache: Cache
) -> Iterator[ty.Union[CacheKey, bytes]]:
fspaths = sorted(fileset.fspaths)
# Yield the cache key for the fileset, which is a tuple of the file-system paths
# and their mtime. Is used to store persistent cache of the fileset hashes
# to avoid recomputation between calls
yield CacheKey(
tuple(repr(p) for p in fspaths) # type: ignore[arg-type]
+ tuple(p.lstat().st_mtime_ns for p in fspaths)
)
yield from fileset.__bytes_repr__(cache)
cls = type(fileset)
yield f"{cls.__module__}.{cls.__name__}:".encode()
for key, chunk_iter in fileset.byte_chunks():
yield (",'" + key + "'=").encode()
yield from chunk_iter


# Need to disable the mtime cache key for mocked filesets. Used in doctests
@register_serializer(MockMixin)
def bytes_repr_mock_fileset(
mock_fileset: MockMixin, cache: Cache
) -> Iterator[ty.Union[CacheKey, bytes]]:
cls = type(mock_fileset)
yield f"{cls.__module__}.{cls.__name__}:".encode()
for key, _ in mock_fileset.byte_chunks():
yield (",'" + key + "'").encode()


@register_serializer(list)
Expand Down

0 comments on commit ce10332

Please sign in to comment.