From 2c190649e03b042b23f3b0db8f6408402d350966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20H=C3=B8xbro=20Hansen?= Date: Mon, 28 Oct 2024 14:55:39 +0100 Subject: [PATCH 1/4] Drop pillow as a required dependency --- datashader/tests/test_tiles.py | 7 ++++++- datashader/tests/test_transfer_functions.py | 4 +++- datashader/tiles.py | 7 +++++-- datashader/transfer_functions/__init__.py | 3 ++- pixi.toml | 3 ++- pyproject.toml | 1 - 6 files changed, 18 insertions(+), 7 deletions(-) diff --git a/datashader/tests/test_tiles.py b/datashader/tests/test_tiles.py index 188e76efd..8c308b665 100644 --- a/datashader/tests/test_tiles.py +++ b/datashader/tests/test_tiles.py @@ -1,4 +1,7 @@ from __future__ import annotations + +import pytest + import datashader as ds import datashader.transfer_functions as tf @@ -42,7 +45,7 @@ def mock_shader_func(agg, span=None): def mock_post_render_func(img, **kwargs): - from PIL import ImageDraw + ImageDraw = pytest.importorskip("PIL.ImageDraw") (x, y) = (5, 5) info = "x={} / y={} / z={}, w={}, h={}".format(kwargs['x'], @@ -58,6 +61,8 @@ def mock_post_render_func(img, **kwargs): # TODO: mark with slow_test def test_render_tiles(): + pytest.importorskip("PIL") + full_extent_of_data = (-500000, -500000, 500000, 500000) levels = list(range(2)) diff --git a/datashader/tests/test_transfer_functions.py b/datashader/tests/test_transfer_functions.py index d26d51495..e0169e08f 100644 --- a/datashader/tests/test_transfer_functions.py +++ b/datashader/tests/test_transfer_functions.py @@ -5,7 +5,6 @@ import numpy as np import xarray as xr import dask.array as da -import PIL import pytest import datashader.transfer_functions as tf from datashader.tests.test_pandas import assert_eq_ndarray, assert_eq_xr, assert_image_close @@ -1123,11 +1122,14 @@ def test_eq_hist(): def test_Image_to_pil(): + PIL = pytest.importorskip('PIL') img = img1.to_pil() assert isinstance(img, PIL.Image.Image) def test_Image_to_bytesio(): + pytest.importorskip('PIL') + bytes = img1.to_bytesio() assert isinstance(bytes, BytesIO) assert bytes.tell() == 0 diff --git a/datashader/tiles.py b/datashader/tiles.py index 524ab7f29..62a4a5ff6 100644 --- a/datashader/tiles.py +++ b/datashader/tiles.py @@ -1,4 +1,5 @@ from __future__ import annotations +from importlib.util import find_spec from io import BytesIO import math @@ -9,8 +10,6 @@ import numpy as np -from PIL.Image import fromarray - __all__ = ['render_tiles', 'MercatorTileDefinition'] @@ -292,11 +291,15 @@ def __init__(self, tile_definition, output_location, tile_format='PNG', self.tile_format = tile_format self.post_render_func = post_render_func + if find_spec("PIL") is None: + raise ImportError('pillow is required to render tiles') # TODO: add all the formats supported by PIL if self.tile_format not in ('PNG', 'JPG'): raise ValueError('Invalid output format') def render(self, da, level): + from PIL import fromarray + xmin, xmax = self.tile_def.x_range ymin, ymax = self.tile_def.y_range extent = xmin, ymin, xmax, ymax diff --git a/datashader/transfer_functions/__init__.py b/datashader/transfer_functions/__init__.py index c75a6bdc0..ab03bb5fc 100644 --- a/datashader/transfer_functions/__init__.py +++ b/datashader/transfer_functions/__init__.py @@ -11,7 +11,6 @@ import toolz as tz import xarray as xr import dask.array as da -from PIL.Image import fromarray from datashader.colors import rgb, Sets1to3 from datashader.utils import nansum_missing, ngjit @@ -30,6 +29,8 @@ class Image(xr.DataArray): border=1 def to_pil(self, origin='lower'): + from PIL.Image import fromarray + data = self.data if cupy: data = cupy.asnumpy(data) diff --git a/pixi.toml b/pixi.toml index be1d76f0d..9790bb034 100644 --- a/pixi.toml +++ b/pixi.toml @@ -29,7 +29,6 @@ numba = "*" numpy = "*" pandas = "*" param = "*" -pillow = "*" pip = "*" pyct = "*" requests = "*" @@ -64,6 +63,7 @@ holoviews = "*" matplotlib-base = ">=3.3" networkx = "*" panel = ">1.1" +pillow = "*" pyogrio = "*" python-graphviz = "*" python-snappy = "*" @@ -96,6 +96,7 @@ geodatasets = "*" geopandas-base = "*" netcdf4 = "*" pyarrow = "*" +pillow = "*" pyogrio = "*" rasterio = "*" rioxarray = "*" diff --git a/pyproject.toml b/pyproject.toml index 689fe4777..52f436cfb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,6 @@ dependencies = [ 'numpy', 'pandas', 'param', - 'pillow', 'pyct', 'requests', 'scipy', From 3fdff3b113019b76b33c6e3d13969f0659695010 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20H=C3=B8xbro=20Hansen?= Date: Mon, 28 Oct 2024 14:56:25 +0100 Subject: [PATCH 2/4] Ignore dask-expr warning --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 52f436cfb..41043d334 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -94,4 +94,5 @@ log_cli_level = "INFO" filterwarnings = [ "ignore:Passing a (SingleBlockManager|BlockManager) to (Series|GeoSeries|DataFrame|GeoDataFrame) is deprecated:DeprecationWarning", # https://github.com/holoviz/spatialpandas/issues/137 "ignore:Accessing the underlying geometries through the `.data`:DeprecationWarning:dask_geopandas.core", # https://github.com/geopandas/dask-geopandas/issues/264 + "ignore:\\s*Dask dataframe query planning is disabled because dask-expr is not installed:FutureWarning", # OK ] From 20cfcf1c8304fc4b2ab3a898ac528200109dc5c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20H=C3=B8xbro=20Hansen?= Date: Tue, 29 Oct 2024 07:02:44 +0100 Subject: [PATCH 3/4] Update tiles.py --- datashader/tiles.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datashader/tiles.py b/datashader/tiles.py index 62a4a5ff6..84b5c8db7 100644 --- a/datashader/tiles.py +++ b/datashader/tiles.py @@ -298,7 +298,7 @@ def __init__(self, tile_definition, output_location, tile_format='PNG', raise ValueError('Invalid output format') def render(self, da, level): - from PIL import fromarray + from PIL.Image import fromarray xmin, xmax = self.tile_def.x_range ymin, ymax = self.tile_def.y_range From 8d62ecd33908421abcf7c54db2653b590c9dc08f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20H=C3=B8xbro=20Hansen?= Date: Thu, 31 Oct 2024 09:37:55 +0100 Subject: [PATCH 4/4] Add note in changelog [skip ci] --- CHANGELOG.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index aee31f038..0c1cd0665 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,3 +1,9 @@ +Version 0.17.0 () +--------------------------- + +NOTE: This drops pillow as a required dependency. + + Version 0.16.3 (2024-07-04) ---------------------------