mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-11-04 09:57:43 +03:00 
			
		
		
		
	Added type hints
This commit is contained in:
		
							parent
							
								
									c7574392b0
								
							
						
					
					
						commit
						afc7d8d0b0
					
				| 
						 | 
					@ -12,7 +12,7 @@ class TestTTypeFontLeak(PillowLeakTestCase):
 | 
				
			||||||
    iterations = 10
 | 
					    iterations = 10
 | 
				
			||||||
    mem_limit = 4096  # k
 | 
					    mem_limit = 4096  # k
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _test_font(self, font: ImageFont.FreeTypeFont) -> None:
 | 
					    def _test_font(self, font: ImageFont.FreeTypeFont | ImageFont.ImageFont) -> None:
 | 
				
			||||||
        im = Image.new("RGB", (255, 255), "white")
 | 
					        im = Image.new("RGB", (255, 255), "white")
 | 
				
			||||||
        draw = ImageDraw.ImageDraw(im)
 | 
					        draw = ImageDraw.ImageDraw(im)
 | 
				
			||||||
        self._test_leak(
 | 
					        self._test_leak(
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -99,10 +99,18 @@ class TestImage:
 | 
				
			||||||
        JPGFILE = "Tests/images/hopper.jpg"
 | 
					        JPGFILE = "Tests/images/hopper.jpg"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with pytest.raises(TypeError):
 | 
					        with pytest.raises(TypeError):
 | 
				
			||||||
            with Image.open(PNGFILE, formats=123):
 | 
					            with Image.open(PNGFILE, formats=123):  # type: ignore[arg-type]
 | 
				
			||||||
                pass
 | 
					                pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for formats in [["JPEG"], ("JPEG",), ["jpeg"], ["Jpeg"], ["jPeG"], ["JpEg"]]:
 | 
					        format_list: list[list[str] | tuple[str, ...]] = [
 | 
				
			||||||
 | 
					            ["JPEG"],
 | 
				
			||||||
 | 
					            ("JPEG",),
 | 
				
			||||||
 | 
					            ["jpeg"],
 | 
				
			||||||
 | 
					            ["Jpeg"],
 | 
				
			||||||
 | 
					            ["jPeG"],
 | 
				
			||||||
 | 
					            ["JpEg"],
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					        for formats in format_list:
 | 
				
			||||||
            with pytest.raises(UnidentifiedImageError):
 | 
					            with pytest.raises(UnidentifiedImageError):
 | 
				
			||||||
                with Image.open(PNGFILE, formats=formats):
 | 
					                with Image.open(PNGFILE, formats=formats):
 | 
				
			||||||
                    pass
 | 
					                    pass
 | 
				
			||||||
| 
						 | 
					@ -138,7 +146,7 @@ class TestImage:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_bad_mode(self) -> None:
 | 
					    def test_bad_mode(self) -> None:
 | 
				
			||||||
        with pytest.raises(ValueError):
 | 
					        with pytest.raises(ValueError):
 | 
				
			||||||
            with Image.open("filename", "bad mode"):
 | 
					            with Image.open("filename", "bad mode"):  # type: ignore[arg-type]
 | 
				
			||||||
                pass
 | 
					                pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_stringio(self) -> None:
 | 
					    def test_stringio(self) -> None:
 | 
				
			||||||
| 
						 | 
					@ -497,9 +505,11 @@ class TestImage:
 | 
				
			||||||
    def test_check_size(self) -> None:
 | 
					    def test_check_size(self) -> None:
 | 
				
			||||||
        # Checking that the _check_size function throws value errors when we want it to
 | 
					        # Checking that the _check_size function throws value errors when we want it to
 | 
				
			||||||
        with pytest.raises(ValueError):
 | 
					        with pytest.raises(ValueError):
 | 
				
			||||||
            Image.new("RGB", 0)  # not a tuple
 | 
					            # not a tuple
 | 
				
			||||||
 | 
					            Image.new("RGB", 0)  # type: ignore[arg-type]
 | 
				
			||||||
        with pytest.raises(ValueError):
 | 
					        with pytest.raises(ValueError):
 | 
				
			||||||
            Image.new("RGB", (0,))  # Tuple too short
 | 
					            # tuple too short
 | 
				
			||||||
 | 
					            Image.new("RGB", (0,))  # type: ignore[arg-type]
 | 
				
			||||||
        with pytest.raises(ValueError):
 | 
					        with pytest.raises(ValueError):
 | 
				
			||||||
            Image.new("RGB", (-1, -1))  # w,h < 0
 | 
					            Image.new("RGB", (-1, -1))  # w,h < 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,7 +7,7 @@ import shutil
 | 
				
			||||||
import sys
 | 
					import sys
 | 
				
			||||||
from io import BytesIO
 | 
					from io import BytesIO
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from typing import Any
 | 
					from typing import Any, Literal, cast
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import pytest
 | 
					import pytest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -209,13 +209,13 @@ def test_exceptions() -> None:
 | 
				
			||||||
        ImageCms.buildTransform("foo", "bar", "RGB", "RGB")
 | 
					        ImageCms.buildTransform("foo", "bar", "RGB", "RGB")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    with pytest.raises(ImageCms.PyCMSError, match="Invalid type for Profile"):
 | 
					    with pytest.raises(ImageCms.PyCMSError, match="Invalid type for Profile"):
 | 
				
			||||||
        ImageCms.getProfileName(None)
 | 
					        ImageCms.getProfileName(None)  # type: ignore[arg-type]
 | 
				
			||||||
    skip_missing()
 | 
					    skip_missing()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Python <= 3.9: "an integer is required (got type NoneType)"
 | 
					    # Python <= 3.9: "an integer is required (got type NoneType)"
 | 
				
			||||||
    # Python > 3.9: "'NoneType' object cannot be interpreted as an integer"
 | 
					    # Python > 3.9: "'NoneType' object cannot be interpreted as an integer"
 | 
				
			||||||
    with pytest.raises(ImageCms.PyCMSError, match="integer"):
 | 
					    with pytest.raises(ImageCms.PyCMSError, match="integer"):
 | 
				
			||||||
        ImageCms.isIntentSupported(SRGB, None, None)
 | 
					        ImageCms.isIntentSupported(SRGB, None, None)  # type: ignore[arg-type]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def test_display_profile() -> None:
 | 
					def test_display_profile() -> None:
 | 
				
			||||||
| 
						 | 
					@ -239,7 +239,7 @@ def test_unsupported_color_space() -> None:
 | 
				
			||||||
            "Color space not supported for on-the-fly profile creation (unsupported)"
 | 
					            "Color space not supported for on-the-fly profile creation (unsupported)"
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
    ):
 | 
					    ):
 | 
				
			||||||
        ImageCms.createProfile("unsupported")
 | 
					        ImageCms.createProfile("unsupported")  # type: ignore[arg-type]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def test_invalid_color_temperature() -> None:
 | 
					def test_invalid_color_temperature() -> None:
 | 
				
			||||||
| 
						 | 
					@ -352,7 +352,7 @@ def test_extended_information() -> None:
 | 
				
			||||||
    p = o.profile
 | 
					    p = o.profile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def assert_truncated_tuple_equal(
 | 
					    def assert_truncated_tuple_equal(
 | 
				
			||||||
        tup1: tuple[Any, ...], tup2: tuple[Any, ...], digits: int = 10
 | 
					        tup1: tuple[Any, ...] | None, tup2: tuple[Any, ...], digits: int = 10
 | 
				
			||||||
    ) -> None:
 | 
					    ) -> None:
 | 
				
			||||||
        # Helper function to reduce precision of tuples of floats
 | 
					        # Helper function to reduce precision of tuples of floats
 | 
				
			||||||
        # recursively and then check equality.
 | 
					        # recursively and then check equality.
 | 
				
			||||||
| 
						 | 
					@ -368,6 +368,7 @@ def test_extended_information() -> None:
 | 
				
			||||||
                for val in tuple_value
 | 
					                for val in tuple_value
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert tup1 is not None
 | 
				
			||||||
        assert truncate_tuple(tup1) == truncate_tuple(tup2)
 | 
					        assert truncate_tuple(tup1) == truncate_tuple(tup2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert p.attributes == 4294967296
 | 
					    assert p.attributes == 4294967296
 | 
				
			||||||
| 
						 | 
					@ -513,22 +514,22 @@ def test_non_ascii_path(tmp_path: Path) -> None:
 | 
				
			||||||
def test_profile_typesafety() -> None:
 | 
					def test_profile_typesafety() -> None:
 | 
				
			||||||
    # does not segfault
 | 
					    # does not segfault
 | 
				
			||||||
    with pytest.raises(TypeError, match="Invalid type for Profile"):
 | 
					    with pytest.raises(TypeError, match="Invalid type for Profile"):
 | 
				
			||||||
        ImageCms.ImageCmsProfile(0).tobytes()
 | 
					        ImageCms.ImageCmsProfile(0)  # type: ignore[arg-type]
 | 
				
			||||||
    with pytest.raises(TypeError, match="Invalid type for Profile"):
 | 
					    with pytest.raises(TypeError, match="Invalid type for Profile"):
 | 
				
			||||||
        ImageCms.ImageCmsProfile(1).tobytes()
 | 
					        ImageCms.ImageCmsProfile(1)  # type: ignore[arg-type]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # also check core function
 | 
					    # also check core function
 | 
				
			||||||
    with pytest.raises(TypeError):
 | 
					    with pytest.raises(TypeError):
 | 
				
			||||||
        ImageCms.core.profile_tobytes(0)
 | 
					        ImageCms.core.profile_tobytes(0)  # type: ignore[arg-type]
 | 
				
			||||||
    with pytest.raises(TypeError):
 | 
					    with pytest.raises(TypeError):
 | 
				
			||||||
        ImageCms.core.profile_tobytes(1)
 | 
					        ImageCms.core.profile_tobytes(1)  # type: ignore[arg-type]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if not is_pypy():
 | 
					    if not is_pypy():
 | 
				
			||||||
        # core profile should not be directly instantiable
 | 
					        # core profile should not be directly instantiable
 | 
				
			||||||
        with pytest.raises(TypeError):
 | 
					        with pytest.raises(TypeError):
 | 
				
			||||||
            ImageCms.core.CmsProfile()
 | 
					            ImageCms.core.CmsProfile()
 | 
				
			||||||
        with pytest.raises(TypeError):
 | 
					        with pytest.raises(TypeError):
 | 
				
			||||||
            ImageCms.core.CmsProfile(0)
 | 
					            ImageCms.core.CmsProfile(0)  # type: ignore[call-arg]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@pytest.mark.skipif(is_pypy(), reason="fails on PyPy")
 | 
					@pytest.mark.skipif(is_pypy(), reason="fails on PyPy")
 | 
				
			||||||
| 
						 | 
					@ -537,7 +538,7 @@ def test_transform_typesafety() -> None:
 | 
				
			||||||
    with pytest.raises(TypeError):
 | 
					    with pytest.raises(TypeError):
 | 
				
			||||||
        ImageCms.core.CmsTransform()
 | 
					        ImageCms.core.CmsTransform()
 | 
				
			||||||
    with pytest.raises(TypeError):
 | 
					    with pytest.raises(TypeError):
 | 
				
			||||||
        ImageCms.core.CmsTransform(0)
 | 
					        ImageCms.core.CmsTransform(0)  # type: ignore[call-arg]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def assert_aux_channel_preserved(
 | 
					def assert_aux_channel_preserved(
 | 
				
			||||||
| 
						 | 
					@ -637,7 +638,8 @@ def test_auxiliary_channels_isolated() -> None:
 | 
				
			||||||
                    continue
 | 
					                    continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                # convert with and without AUX data, test colors are equal
 | 
					                # convert with and without AUX data, test colors are equal
 | 
				
			||||||
                source_profile = ImageCms.createProfile(src_format[1])
 | 
					                src_colorSpace = cast(Literal["LAB", "XYZ", "sRGB"], src_format[1])
 | 
				
			||||||
 | 
					                source_profile = ImageCms.createProfile(src_colorSpace)
 | 
				
			||||||
                destination_profile = ImageCms.createProfile(dst_format[1])
 | 
					                destination_profile = ImageCms.createProfile(dst_format[1])
 | 
				
			||||||
                source_image = src_format[3]
 | 
					                source_image = src_format[3]
 | 
				
			||||||
                test_transform = ImageCms.buildTransform(
 | 
					                test_transform = ImageCms.buildTransform(
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,10 +25,10 @@ def test_sanity() -> None:
 | 
				
			||||||
    st.stddev
 | 
					    st.stddev
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    with pytest.raises(AttributeError):
 | 
					    with pytest.raises(AttributeError):
 | 
				
			||||||
        st.spam()
 | 
					        st.spam()  # type: ignore[attr-defined]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    with pytest.raises(TypeError):
 | 
					    with pytest.raises(TypeError):
 | 
				
			||||||
        ImageStat.Stat(1)
 | 
					        ImageStat.Stat(1)  # type: ignore[arg-type]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def test_hopper() -> None:
 | 
					def test_hopper() -> None:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user