Added context managers

This commit is contained in:
Andrew Murray 2021-02-11 21:43:54 +11:00
parent c2203a13a8
commit 83542c42bf
15 changed files with 56 additions and 29 deletions

View File

@ -5,4 +5,5 @@ from io import BytesIO
from PIL import Image from PIL import Image
Image.open(BytesIO(b"icns\x00\x00\x00\x10hang\x00\x00\x00\x00")) with Image.open(BytesIO(b"icns\x00\x00\x00\x10hang\x00\x00\x00\x00")):
pass

View File

@ -5,4 +5,7 @@ from io import BytesIO
from PIL import Image from PIL import Image
Image.open(BytesIO(b"\x00\x00\x00\x0cjP\x20\x20\x0d\x0a\x87\x0a\x00\x00\x00\x00hang")) with Image.open(
BytesIO(b"\x00\x00\x00\x0cjP\x20\x20\x0d\x0a\x87\x0a\x00\x00\x00\x00hang")
):
pass

View File

@ -54,15 +54,18 @@ class TestDecompressionBomb:
def test_exception_ico(self): def test_exception_ico(self):
with pytest.raises(Image.DecompressionBombError): with pytest.raises(Image.DecompressionBombError):
Image.open("Tests/images/decompression_bomb.ico") with Image.open("Tests/images/decompression_bomb.ico"):
pass
def test_exception_gif(self): def test_exception_gif(self):
with pytest.raises(Image.DecompressionBombError): with pytest.raises(Image.DecompressionBombError):
Image.open("Tests/images/decompression_bomb.gif") with Image.open("Tests/images/decompression_bomb.gif"):
pass
def test_exception_bmp(self): def test_exception_bmp(self):
with pytest.raises(Image.DecompressionBombError): with pytest.raises(Image.DecompressionBombError):
Image.open("Tests/images/bmp/b/reallybig.bmp") with Image.open("Tests/images/bmp/b/reallybig.bmp"):
pass
class TestDecompressionCrop: class TestDecompressionCrop:

View File

@ -123,7 +123,8 @@ def test_dx10_r8g8b8a8_unorm_srgb():
def test_unimplemented_dxgi_format(): def test_unimplemented_dxgi_format():
with pytest.raises(NotImplementedError): with pytest.raises(NotImplementedError):
Image.open("Tests/images/unimplemented_dxgi_format.dds") with Image.open("Tests/images/unimplemented_dxgi_format.dds"):
pass
def test_uncompressed_rgb(): def test_uncompressed_rgb():
@ -170,7 +171,8 @@ def test_short_header():
img_file = f.read() img_file = f.read()
def short_header(): def short_header():
Image.open(BytesIO(img_file[:119])) with Image.open(BytesIO(img_file[:119])):
pass
with pytest.raises(OSError): with pytest.raises(OSError):
short_header() short_header()
@ -192,4 +194,5 @@ def test_short_file():
def test_unimplemented_pixel_format(): def test_unimplemented_pixel_format():
with pytest.raises(NotImplementedError): with pytest.raises(NotImplementedError):
Image.open("Tests/images/unimplemented_pixel_format.dds") with Image.open("Tests/images/unimplemented_pixel_format.dds"):
pass

View File

@ -21,4 +21,5 @@ def test_invalid_file():
def test_fpx_invalid_number_of_bands(): def test_fpx_invalid_number_of_bands():
with pytest.raises(OSError, match="Invalid number of bands"): with pytest.raises(OSError, match="Invalid number of bands"):
Image.open("Tests/images/input_bw_five_bands.fpx") with Image.open("Tests/images/input_bw_five_bands.fpx"):
pass

View File

@ -798,7 +798,8 @@ class TestFileJpeg:
buffer.read = read buffer.read = read
with pytest.raises(UnidentifiedImageError): with pytest.raises(UnidentifiedImageError):
Image.open(buffer) with Image.open(buffer):
pass
# Assert the entire file has not been read # Assert the entire file has not been read
assert 0 < buffer.max_pos < size assert 0 < buffer.max_pos < size

View File

@ -219,7 +219,8 @@ def test_16bit_jp2_roundtrips():
def test_unbound_local(): def test_unbound_local():
# prepatch, a malformed jp2 file could cause an UnboundLocalError exception. # prepatch, a malformed jp2 file could cause an UnboundLocalError exception.
with pytest.raises(OSError): with pytest.raises(OSError):
Image.open("Tests/images/unbound_variable.jp2") with Image.open("Tests/images/unbound_variable.jp2"):
pass
def test_parser_feed(): def test_parser_feed():

View File

@ -106,7 +106,8 @@ class TestFilePng:
test_file = "Tests/images/broken.png" test_file = "Tests/images/broken.png"
with pytest.raises(OSError): with pytest.raises(OSError):
Image.open(test_file) with Image.open(test_file):
pass
def test_bad_text(self): def test_bad_text(self):
# Make sure PIL can read malformed tEXt chunks (@PIL152) # Make sure PIL can read malformed tEXt chunks (@PIL152)
@ -464,7 +465,8 @@ class TestFilePng:
pngfile = BytesIO(data) pngfile = BytesIO(data)
with pytest.raises(OSError): with pytest.raises(OSError):
Image.open(pngfile) with Image.open(pngfile):
pass
def test_trns_rgb(self): def test_trns_rgb(self):
# Check writing and reading of tRNS chunks for RGB images. # Check writing and reading of tRNS chunks for RGB images.

View File

@ -56,7 +56,8 @@ def test_truncated_file(tmp_path):
f.write("P6") f.write("P6")
with pytest.raises(ValueError): with pytest.raises(ValueError):
Image.open(path) with Image.open(path):
pass
def test_neg_ppm(): def test_neg_ppm():
@ -66,7 +67,8 @@ def test_neg_ppm():
# sizes. # sizes.
with pytest.raises(OSError): with pytest.raises(OSError):
Image.open("Tests/images/negative_size.ppm") with Image.open("Tests/images/negative_size.ppm"):
pass
def test_mimetypes(tmp_path): def test_mimetypes(tmp_path):

View File

@ -128,4 +128,5 @@ def test_combined_larger_than_size():
# If we instead take the 'size' of the extra data field as the source of truth, # If we instead take the 'size' of the extra data field as the source of truth,
# then the seek can't be negative # then the seek can't be negative
with pytest.raises(OSError): with pytest.raises(OSError):
Image.open("Tests/images/combined_larger_than_size.psd") with Image.open("Tests/images/combined_larger_than_size.psd"):
pass

View File

@ -136,7 +136,8 @@ def test_invalid_file():
invalid_file = "Tests/images/invalid.spider" invalid_file = "Tests/images/invalid.spider"
with pytest.raises(OSError): with pytest.raises(OSError):
Image.open(invalid_file) with Image.open(invalid_file):
pass
def test_nonstack_file(): def test_nonstack_file():

View File

@ -163,9 +163,8 @@ class TestFileTiff:
def test_save_setting_missing_resolution(self): def test_save_setting_missing_resolution(self):
b = BytesIO() b = BytesIO()
Image.open("Tests/images/10ct_32bit_128.tiff").save( with Image.open("Tests/images/10ct_32bit_128.tiff") as im:
b, format="tiff", resolution=123.45 im.save(b, format="tiff", resolution=123.45)
)
with Image.open(b) as im: with Image.open(b) as im:
assert float(im.tag_v2[X_RESOLUTION]) == 123.45 assert float(im.tag_v2[X_RESOLUTION]) == 123.45
assert float(im.tag_v2[Y_RESOLUTION]) == 123.45 assert float(im.tag_v2[Y_RESOLUTION]) == 123.45
@ -248,7 +247,8 @@ class TestFileTiff:
def test_unknown_pixel_mode(self): def test_unknown_pixel_mode(self):
with pytest.raises(OSError): with pytest.raises(OSError):
Image.open("Tests/images/hopper_unknown_pixel_mode.tif") with Image.open("Tests/images/hopper_unknown_pixel_mode.tif"):
pass
def test_n_frames(self): def test_n_frames(self):
for path, n_frames in [ for path, n_frames in [
@ -605,7 +605,8 @@ class TestFileTiff:
def test_string_dimension(self): def test_string_dimension(self):
# Assert that an error is raised if one of the dimensions is a string # Assert that an error is raised if one of the dimensions is a string
with pytest.raises(ValueError): with pytest.raises(ValueError):
Image.open("Tests/images/string_dimension.tiff") with Image.open("Tests/images/string_dimension.tiff"):
pass
@pytest.mark.skipif(not is_win32(), reason="Windows only") @pytest.mark.skipif(not is_win32(), reason="Windows only")

View File

@ -165,7 +165,8 @@ class TestFileWebp:
# Save as GIF # Save as GIF
out_gif = str(tmp_path / "temp.gif") out_gif = str(tmp_path / "temp.gif")
Image.open(out_webp).save(out_gif) with Image.open(out_webp) as im:
im.save(out_gif)
with Image.open(out_gif) as reread: with Image.open(out_gif) as reread:
reread_value = reread.convert("RGB").getpixel((1, 1)) reread_value = reread.convert("RGB").getpixel((1, 1))

View File

@ -92,11 +92,13 @@ class TestImage:
JPGFILE = "Tests/images/hopper.jpg" JPGFILE = "Tests/images/hopper.jpg"
with pytest.raises(TypeError): with pytest.raises(TypeError):
Image.open(PNGFILE, formats=123) with Image.open(PNGFILE, formats=123):
pass
for formats in [["JPEG"], ("JPEG",), ["jpeg"], ["Jpeg"], ["jPeG"], ["JpEg"]]: for formats in [["JPEG"], ("JPEG",), ["jpeg"], ["Jpeg"], ["jPeG"], ["JpEg"]]:
with pytest.raises(UnidentifiedImageError): with pytest.raises(UnidentifiedImageError):
Image.open(PNGFILE, formats=formats) with Image.open(PNGFILE, formats=formats):
pass
with Image.open(JPGFILE, formats=formats) as im: with Image.open(JPGFILE, formats=formats) as im:
assert im.mode == "RGB" assert im.mode == "RGB"
@ -120,15 +122,18 @@ class TestImage:
im = io.BytesIO(b"") im = io.BytesIO(b"")
with pytest.raises(UnidentifiedImageError): with pytest.raises(UnidentifiedImageError):
Image.open(im) with Image.open(im):
pass
def test_bad_mode(self): def test_bad_mode(self):
with pytest.raises(ValueError): with pytest.raises(ValueError):
Image.open("filename", "bad mode") with Image.open("filename", "bad mode"):
pass
def test_stringio(self): def test_stringio(self):
with pytest.raises(ValueError): with pytest.raises(ValueError):
Image.open(io.StringIO()) with Image.open(io.StringIO()):
pass
def test_pathlib(self, tmp_path): def test_pathlib(self, tmp_path):
from PIL.Image import Path from PIL.Image import Path

View File

@ -110,4 +110,5 @@ if is_win32():
DeleteObject(dib) DeleteObject(dib)
DeleteDC(hdc) DeleteDC(hdc)
Image.open(BytesIO(bitmap)).save(opath) with Image.open(BytesIO(bitmap)) as im:
im.save(opath)