bqplot-image-gl icon indicating copy to clipboard operation
bqplot-image-gl copied to clipboard

Pillow deprecation warning causing downstream tests to fail

Open rosteen opened this issue 5 months ago • 1 comments

Serialization is now hitting a deprecation warning since the most recent Pillow release:

 ../../.tox/py312-test/lib/python3.12/site-packages/bqplot_image_gl/serialize.py:10: in array_to_image_or_array
    return array_to_image(array, widget.compression)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../../.tox/py312-test/lib/python3.12/site-packages/bqplot_image_gl/serialize.py:59: in array_to_image
    image = Image.fromarray(array_bytes, mode="RGBA")

../../.tox/py312-test/lib/python3.12/site-packages/PIL/Image.py:3314: in fromarray
    deprecate("'mode' parameter", 13)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

deprecated = "'mode' parameter", when = 13, replacement = None

    def deprecate(
        deprecated: str,
        when: int | None,
        replacement: str | None = None,
        *,
        action: str | None = None,
        plural: bool = False,
        stacklevel: int = 3,
    ) -> None:
        """
        Deprecations helper.
    
        :param deprecated: Name of thing to be deprecated.
        :param when: Pillow major version to be removed in.
        :param replacement: Name of replacement.
        :param action: Instead of "replacement", give a custom call to action
            e.g. "Upgrade to new thing".
        :param plural: if the deprecated thing is plural, needing "are" instead of "is".
    
        Usually of the form:
    
            "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd).
            Use [replacement] instead."
    
        You can leave out the replacement sentence:
    
            "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd)"
    
        Or with another call to action:
    
            "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd).
            [action]."
        """
    
        is_ = "are" if plural else "is"
    
        if when is None:
            removed = "a future version"
        elif when <= int(__version__.split(".")[0]):
            msg = f"{deprecated} {is_} deprecated and should be removed."
            raise RuntimeError(msg)
        elif when == 12:
            removed = "Pillow 12 (2025-10-15)"
        elif when == 13:
            removed = "Pillow 13 (2026-10-15)"
        else:
            msg = f"Unknown removal version: {when}. Update {__name__}?"
            raise ValueError(msg)
    
        if replacement and action:
            msg = "Use only one of 'replacement' and 'action'"
            raise ValueError(msg)
    
        if replacement:
            action = f". Use {replacement} instead."
        elif action:
            action = f". {action.rstrip('.')}."
        else:
            action = ""
    
>       warnings.warn(
            f"{deprecated} {is_} deprecated and will be removed in {removed}{action}",
            DeprecationWarning,
            stacklevel=stacklevel,
        )
E       DeprecationWarning: 'mode' parameter is deprecated and will be removed in Pillow 13 (2026-10-15)

../../.tox/py312-test/lib/python3.12/site-packages/PIL/_deprecate.py:68: DeprecationWarning

rosteen avatar Jul 01 '25 14:07 rosteen

Note that deprecation is not yet finalised; see python-pillow/Pillow#9063

dhomeier avatar Jul 04 '25 15:07 dhomeier