From 0542b6bb9563a531e3251e20bb746c3620bbe7f7 Mon Sep 17 00:00:00 2001 From: Bane Sullivan Date: Thu, 12 Sep 2024 23:49:26 +0000 Subject: [PATCH 1/2] Support dict with MultiFileTileSource --- sources/multi/large_image_source_multi/__init__.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/sources/multi/large_image_source_multi/__init__.py b/sources/multi/large_image_source_multi/__init__.py index bc2d6ea77..da0e48b08 100644 --- a/sources/multi/large_image_source_multi/__init__.py +++ b/sources/multi/large_image_source_multi/__init__.py @@ -434,7 +434,16 @@ def __init__(self, path, **kwargs): self._lastOpenSourceLock = threading.RLock() # 'c' must be first as channels are special because they can have names self._axesList = ['c', 'z', 't', 'xy'] - if not os.path.isfile(self._largeImagePath): + if isinstance(path, dict): + self._info = path.copy() + self._basePath = "." + self._largeImagePath = "." + try: + self._validator.validate(self._info) + except jsonschema.ValidationError: + msg = 'File cannot be validated via multi-source reader.' + raise TileSourceError(msg) + elif not os.path.isfile(self._largeImagePath): try: possibleYaml = self._largeImagePath.split('multi://', 1)[-1] self._info = yaml.safe_load(possibleYaml) From f75e84f8d1a82b207522ca54947b682473a23a9e Mon Sep 17 00:00:00 2001 From: David Manthey Date: Mon, 16 Sep 2024 13:08:56 -0400 Subject: [PATCH 2/2] Fix working with Girder sources and linting. Add a basic test. --- .../multi/large_image_source_multi/__init__.py | 8 ++++---- test/test_source_multi.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/sources/multi/large_image_source_multi/__init__.py b/sources/multi/large_image_source_multi/__init__.py index da0e48b08..c6838d574 100644 --- a/sources/multi/large_image_source_multi/__init__.py +++ b/sources/multi/large_image_source_multi/__init__.py @@ -419,7 +419,7 @@ class MultiFileTileSource(FileTileSource, metaclass=LruCacheMetaclass): _defaultTileSize = 256 _maxOpenHandles = 6 - def __init__(self, path, **kwargs): + def __init__(self, path, **kwargs): # noqa """ Initialize the tile class. See the base class for other available parameters. @@ -434,10 +434,10 @@ def __init__(self, path, **kwargs): self._lastOpenSourceLock = threading.RLock() # 'c' must be first as channels are special because they can have names self._axesList = ['c', 'z', 't', 'xy'] - if isinstance(path, dict): + if isinstance(path, dict) and 'sources' in path: self._info = path.copy() - self._basePath = "." - self._largeImagePath = "." + self._basePath = '.' + self._largeImagePath = '.' try: self._validator.validate(self._info) except jsonschema.ValidationError: diff --git a/test/test_source_multi.py b/test/test_source_multi.py index fbf749035..8f856b11c 100644 --- a/test/test_source_multi.py +++ b/test/test_source_multi.py @@ -126,6 +126,22 @@ def testTilesFromMultiString(): large_image_source_multi.open('invalid' + sourceString) +def testTilesFromMultiDict(): + sourceString = {'sources': [{ + 'sourceName': 'test', 'path': '__none__', 'params': {'sizeX': 10000, 'sizeY': 10000}}]} + source = large_image_source_multi.open(sourceString) + tileMetadata = source.getMetadata() + assert tileMetadata['tileWidth'] == 256 + assert tileMetadata['tileHeight'] == 256 + assert tileMetadata['sizeX'] == 10000 + assert tileMetadata['sizeY'] == 10000 + assert tileMetadata['levels'] == 7 + utilities.checkTilesZXY(source, tileMetadata) + + with pytest.raises(Exception): + large_image_source_multi.open({'invalid': True}) + + def testTilesFromNonschemaMultiString(): sourceString = json.dumps({ 'sources': [{