diff --git a/Tests/test_image.py b/Tests/test_image.py index 55e70a326..b0fd7c540 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -3,6 +3,7 @@ import os import shutil import tempfile +import PIL import pytest from PIL import Image, ImageDraw, ImagePalette, UnidentifiedImageError @@ -608,6 +609,34 @@ class TestImage: assert not fp.closed + @pytest.mark.parametrize( + "test_module", [PIL, Image], + ) + def test_pillow_version(self, test_module): + with pytest.warns(DeprecationWarning): + assert test_module.PILLOW_VERSION == PIL.__version__ + + with pytest.warns(DeprecationWarning): + str(test_module.PILLOW_VERSION) + + with pytest.warns(DeprecationWarning): + assert int(test_module.PILLOW_VERSION[0]) >= 7 + + with pytest.warns(DeprecationWarning): + assert test_module.PILLOW_VERSION < "9.9.0" + + with pytest.warns(DeprecationWarning): + assert test_module.PILLOW_VERSION <= "9.9.0" + + with pytest.warns(DeprecationWarning): + assert test_module.PILLOW_VERSION != "7.0.0" + + with pytest.warns(DeprecationWarning): + assert test_module.PILLOW_VERSION >= "7.0.0" + + with pytest.warns(DeprecationWarning): + assert test_module.PILLOW_VERSION > "7.0.0" + def test_overrun(self): for file in [ "fli_overrun.bin", diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 9328d44a0..7b96b14f4 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -42,18 +42,32 @@ from pathlib import Path # PILLOW_VERSION is deprecated and will be removed in a future release. # Use __version__ instead. from . import ( - PILLOW_VERSION, ImageMode, TiffTags, UnidentifiedImageError, __version__, _plugins, + _raise_version_warning, ) from ._binary import i8, i32le from ._util import deferred_error, isPath -# Silence warning -assert PILLOW_VERSION +if sys.version_info >= (3, 7): + + def __getattr__(name): + if name == "PILLOW_VERSION": + _raise_version_warning() + return __version__ + raise AttributeError("module '{}' has no attribute '{}'".format(__name__, name)) + + +else: + + from . import PILLOW_VERSION + + # Silence warning + assert PILLOW_VERSION + logger = logging.getLogger(__name__) diff --git a/src/PIL/__init__.py b/src/PIL/__init__.py index d459fa45d..f9cb15772 100644 --- a/src/PIL/__init__.py +++ b/src/PIL/__init__.py @@ -13,12 +13,71 @@ Use PIL.__version__ for this Pillow version. ;-) """ +import sys +import warnings + from . import _version # VERSION was removed in Pillow 6.0.0. +__version__ = _version.__version__ + + # PILLOW_VERSION is deprecated and will be removed in a future release. # Use __version__ instead. -PILLOW_VERSION = __version__ = _version.__version__ +def _raise_version_warning(): + warnings.warn( + "PILLOW_VERSION is deprecated and will be removed in a future release. " + "Use __version__ instead.", + DeprecationWarning, + stacklevel=3, + ) + + +if sys.version_info >= (3, 7): + + def __getattr__(name): + if name == "PILLOW_VERSION": + _raise_version_warning() + return __version__ + raise AttributeError("module '{}' has no attribute '{}'".format(__name__, name)) + + +else: + + class _Deprecated_Version(str): + def __str__(self): + _raise_version_warning() + return super().__str__() + + def __getitem__(self, key): + _raise_version_warning() + return super().__getitem__(key) + + def __eq__(self, other): + _raise_version_warning() + return super().__eq__(other) + + def __ne__(self, other): + _raise_version_warning() + return super().__ne__(other) + + def __gt__(self, other): + _raise_version_warning() + return super().__gt__(other) + + def __lt__(self, other): + _raise_version_warning() + return super().__lt__(other) + + def __ge__(self, other): + _raise_version_warning() + return super().__gt__(other) + + def __le__(self, other): + _raise_version_warning() + return super().__lt__(other) + + PILLOW_VERSION = _Deprecated_Version(__version__) del _version