diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b3a46f63..62dc814a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,12 @@ # Change Log +## Unreleased + ## Version 1.9.0 +### Improvements +- Expand user paths ([#746](../../pull/746)) + ### Features - Better palette support in styles ([#724](../../pull/724)) - Enumerate available palettes ([#741](../../pull/741)) diff --git a/large_image/tilesource/__init__.py b/large_image/tilesource/__init__.py index 1f29a636d..5fe86c739 100644 --- a/large_image/tilesource/__init__.py +++ b/large_image/tilesource/__init__.py @@ -28,7 +28,7 @@ def isGeospatial(path): # TODO: log a warning return False try: - ds = gdal.Open(path, gdalconst.GA_ReadOnly) + ds = gdal.Open(str(path), gdalconst.GA_ReadOnly) except Exception: return False if ds: @@ -74,8 +74,8 @@ def getSourceNameFromDict(availableSources, pathOrUri, *args, **kwargs): :returns: the name of a tile source that can read the input, or None if there is no such source. """ - uriWithoutProtocol = pathOrUri.split('://', 1)[-1] - isLargeImageUri = pathOrUri.startswith('large_image://') + uriWithoutProtocol = str(pathOrUri).split('://', 1)[-1] + isLargeImageUri = str(pathOrUri).startswith('large_image://') extensions = [ext.lower() for ext in os.path.basename(uriWithoutProtocol).split('.')[1:]] properties = { 'geospatial': isGeospatial(pathOrUri), diff --git a/large_image/tilesource/base.py b/large_image/tilesource/base.py index bf9a5c417..062a5aeea 100644 --- a/large_image/tilesource/base.py +++ b/large_image/tilesource/base.py @@ -2332,6 +2332,13 @@ def __init__(self, path, *args, **kwargs): :param path: a filesystem path for the tile source. """ super().__init__(*args, **kwargs) + # Expand the user without converting datatype of path. + try: + path = (path.expanduser() if callable(getattr(path, 'expanduser', None)) else + os.path.expanduser(path)) + except TypeError: + # Don't fail if the path is unusual -- maybe a source can handle it + pass self.largeImagePath = path @staticmethod diff --git a/sources/bioformats/setup.py b/sources/bioformats/setup.py index 8a3701b34..812eccae8 100644 --- a/sources/bioformats/setup.py +++ b/sources/bioformats/setup.py @@ -43,11 +43,11 @@ def prerelease_local_scheme(version): 'Programming Language :: Python :: 3.10', ], install_requires=[ - 'large-image>=1.0.0', + 'large-image', 'python-bioformats>=1.5.2', ], extras_require={ - 'girder': 'girder-large-image>=1.0.0', + 'girder': 'girder-large-image', }, keywords='large_image, tile source', packages=find_packages(exclude=['test', 'test.*']), diff --git a/sources/deepzoom/setup.py b/sources/deepzoom/setup.py index 58ec00286..712382bf2 100644 --- a/sources/deepzoom/setup.py +++ b/sources/deepzoom/setup.py @@ -43,10 +43,10 @@ def prerelease_local_scheme(version): 'Programming Language :: Python :: 3.10', ], install_requires=[ - 'large-image>=1.0.0', + 'large-image', ], extras_require={ - 'girder': 'girder-large-image>=1.0.0', + 'girder': 'girder-large-image', }, keywords='large_image, tile source', packages=find_packages(exclude=['test', 'test.*']), diff --git a/sources/dummy/setup.py b/sources/dummy/setup.py index b4a4bd1b8..47a914f26 100644 --- a/sources/dummy/setup.py +++ b/sources/dummy/setup.py @@ -43,7 +43,7 @@ def prerelease_local_scheme(version): 'Programming Language :: Python :: 3.10', ], install_requires=[ - 'large-image>=1.0.0', + 'large-image', ], keywords='large_image, tile source', packages=find_packages(exclude=['test', 'test.*']), diff --git a/sources/gdal/setup.py b/sources/gdal/setup.py index b932a75e8..edd6aee34 100644 --- a/sources/gdal/setup.py +++ b/sources/gdal/setup.py @@ -43,12 +43,12 @@ def prerelease_local_scheme(version): 'Programming Language :: Python :: 3.10', ], install_requires=[ - 'large-image>=1.0.0', + 'large-image', 'gdal', 'pyproj>=2.2.0', ], extras_require={ - 'girder': 'girder-large-image>=1.0.0', + 'girder': 'girder-large-image', }, keywords='large_image, tile source', packages=find_packages(exclude=['test', 'test.*']), diff --git a/sources/mapnik/setup.py b/sources/mapnik/setup.py index 58b620250..761a5e850 100644 --- a/sources/mapnik/setup.py +++ b/sources/mapnik/setup.py @@ -43,12 +43,12 @@ def prerelease_local_scheme(version): 'Programming Language :: Python :: 3.10', ], install_requires=[ - 'large-image>=1.0.0', + 'large-image', 'large-image-source-gdal', 'mapnik', ], extras_require={ - 'girder': 'girder-large-image>=1.0.0', + 'girder': 'girder-large-image', }, keywords='large_image, tile source', packages=find_packages(exclude=['test', 'test.*']), diff --git a/sources/nd2/setup.py b/sources/nd2/setup.py index cff86b95b..ed74d44a6 100644 --- a/sources/nd2/setup.py +++ b/sources/nd2/setup.py @@ -43,12 +43,12 @@ def prerelease_local_scheme(version): 'Programming Language :: Python :: 3.10', ], install_requires=[ - 'large-image>=1.0.0', + 'large-image', 'nd2reader>=3.3', 'importlib-metadata ; python_version < "3.8"', ], extras_require={ - 'girder': 'girder-large-image>=1.0.0', + 'girder': 'girder-large-image', }, keywords='large_image, tile source', packages=find_packages(exclude=['test', 'test.*']), diff --git a/sources/ometiff/setup.py b/sources/ometiff/setup.py index bdb89eb74..f62944e17 100644 --- a/sources/ometiff/setup.py +++ b/sources/ometiff/setup.py @@ -43,11 +43,11 @@ def prerelease_local_scheme(version): 'Programming Language :: Python :: 3.10', ], install_requires=[ - 'large-image>=1.0.0', + 'large-image', 'large-image-source-tiff>=1.0.0', ], extras_require={ - 'girder': 'girder-large-image>=1.0.0', + 'girder': 'girder-large-image', }, keywords='large_image, tile source', packages=find_packages(exclude=['test', 'test.*']), diff --git a/sources/openjpeg/setup.py b/sources/openjpeg/setup.py index a21353f0a..426e5a484 100644 --- a/sources/openjpeg/setup.py +++ b/sources/openjpeg/setup.py @@ -43,12 +43,12 @@ def prerelease_local_scheme(version): 'Programming Language :: Python :: 3.10', ], install_requires=[ - 'large-image>=1.0.0', + 'large-image', 'glymur>=0.8.18 ; python_version >= "3.7"', 'glymur>=0.8.18,<0.9.4 ; python_version < "3.7"', ], extras_require={ - 'girder': 'girder-large-image>=1.0.0', + 'girder': 'girder-large-image', }, keywords='large_image, tile source', packages=find_packages(exclude=['test', 'test.*']), diff --git a/sources/openslide/setup.py b/sources/openslide/setup.py index 66d63b9c6..5d8daf5a9 100644 --- a/sources/openslide/setup.py +++ b/sources/openslide/setup.py @@ -43,12 +43,12 @@ def prerelease_local_scheme(version): 'Programming Language :: Python :: 3.10', ], install_requires=[ - 'large-image>=1.0.0', + 'large-image', 'openslide-python>=1.1.0', 'tifftools>=1.2.0', ], extras_require={ - 'girder': 'girder-large-image>=1.0.0', + 'girder': 'girder-large-image', }, keywords='large_image, tile source', packages=find_packages(exclude=['test', 'test.*']), diff --git a/sources/pil/setup.py b/sources/pil/setup.py index b518655c0..d19bacaf7 100644 --- a/sources/pil/setup.py +++ b/sources/pil/setup.py @@ -43,10 +43,10 @@ def prerelease_local_scheme(version): 'Programming Language :: Python :: 3.10', ], install_requires=[ - 'large-image>=1.0.0', + 'large-image', ], extras_require={ - 'girder': 'girder-large-image>=1.0.0', + 'girder': 'girder-large-image', }, keywords='large_image, tile source', packages=find_packages(exclude=['test', 'test.*']), diff --git a/sources/test/setup.py b/sources/test/setup.py index 0a4e08fff..9f06b6f87 100644 --- a/sources/test/setup.py +++ b/sources/test/setup.py @@ -43,7 +43,7 @@ def prerelease_local_scheme(version): 'Programming Language :: Python :: 3.10', ], install_requires=[ - 'large-image>=1.0.0', + 'large-image', ], keywords='large_image, tile source', packages=find_packages(exclude=['test', 'test.*']), diff --git a/sources/tiff/setup.py b/sources/tiff/setup.py index 1efdfc4a9..6b41efc43 100644 --- a/sources/tiff/setup.py +++ b/sources/tiff/setup.py @@ -43,12 +43,12 @@ def prerelease_local_scheme(version): 'Programming Language :: Python :: 3.10', ], install_requires=[ - 'large-image>=1.0.0', + 'large-image', 'libtiff>=0.4.1', 'tifftools>=1.2.0', ], extras_require={ - 'girder': 'girder-large-image>=1.0.0', + 'girder': 'girder-large-image', }, keywords='large_image, tile source', packages=find_packages(exclude=['test', 'test.*']), diff --git a/test/test_source_base.py b/test/test_source_base.py index 3b1cd4703..5eb34db7c 100644 --- a/test/test_source_base.py +++ b/test/test_source_base.py @@ -190,3 +190,14 @@ def testGetAvailableNamedPalettes(): assert len(large_image.tilesource.utilities.getAvailableNamedPalettes(False)) > \ len(large_image.tilesource.utilities.getAvailableNamedPalettes(False, True)) + + +def testExpanduserPath(): + imagePath = datastore.fetch('sample_image.ptif') + assert large_image.canRead(imagePath) + absPath = os.path.abspath(imagePath) + userDir = os.path.expanduser('~') + os.sep + if absPath.startswith(userDir): + userPath = '~' + os.sep + absPath[len(userDir):] + assert large_image.canRead(userPath) + assert large_image.canRead(Path(userPath))