mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-25 17:36:18 +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