From 3cf4f0979af93123e6a896830b0ee1c45846cf00 Mon Sep 17 00:00:00 2001 From: Simon Conseil Date: Sat, 15 Jul 2023 15:30:28 +0200 Subject: [PATCH] Use pillow's context manager --- src/sigal/image.py | 4 ++++ src/sigal/plugins/watermark.py | 4 ++-- src/sigal/video.py | 4 ++-- tests/test_image.py | 35 +++++++++++++++++----------------- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/sigal/image.py b/src/sigal/image.py index 9bc6a98..83a994a 100644 --- a/src/sigal/image.py +++ b/src/sigal/image.py @@ -282,6 +282,7 @@ def get_iptc_data(filename): def get_image_metadata(filename): logger = logging.getLogger(__name__) exif, iptc, size = {}, {}, {} + img = None try: img = _read_image(filename) @@ -303,6 +304,9 @@ def get_image_metadata(filename): size = get_size(img) except Exception as e: logger.warning("Could not read size from %s: %s", filename, e) + finally: + if img is not None: + img.close() return {"exif": exif, "iptc": iptc, "size": size} diff --git a/src/sigal/plugins/watermark.py b/src/sigal/plugins/watermark.py index 8f2290e..1f55374 100644 --- a/src/sigal/plugins/watermark.py +++ b/src/sigal/plugins/watermark.py @@ -86,10 +86,10 @@ def watermark(im, mark, position, opacity=1): def add_watermark(img, settings=None): logger = logging.getLogger(__name__) logger.debug("Adding watermark to %r", img) - mark = Image.open(settings["watermark"]) position = settings.get("watermark_position", "scale") opacity = settings.get("watermark_opacity", 1) - return watermark(img, mark, position, opacity) + with Image.open(settings["watermark"]) as mark: + return watermark(img, mark, position, opacity) def register(settings): diff --git a/src/sigal/video.py b/src/sigal/video.py index 482965a..593c20b 100644 --- a/src/sigal/video.py +++ b/src/sigal/video.py @@ -198,8 +198,8 @@ def generate_thumbnail( logger.debug("Create thumbnail for video: %s", " ".join(cmd)) check_subprocess(cmd, source, outname) if os.path.isfile(tmpfile) and black_retries > 0: - img = PILImage.open(tmpfile) - colors = img.getcolors(maxcolors=black_max_colors) + with PILImage.open(tmpfile) as img: + colors = img.getcolors(maxcolors=black_max_colors) if colors is None: # There were more colors than maxcolors in the image, it # looks suitable for a valid thumbnail diff --git a/tests/test_image.py b/tests/test_image.py index 5bbd5fd..133ca51 100644 --- a/tests/test_image.py +++ b/tests/test_image.py @@ -42,8 +42,8 @@ def test_process_image(tmpdir): image = Image(TEST_IMAGE, ".", settings) status = process_image(image) assert status == Status.SUCCESS - im = PILImage.open(os.path.join(str(tmpdir), TEST_IMAGE)) - assert im.size == settings["img_size"] + with PILImage.open(os.path.join(str(tmpdir), TEST_IMAGE)) as im: + assert im.size == settings["img_size"] def test_generate_image(tmpdir): @@ -56,8 +56,8 @@ def test_generate_image(tmpdir): ) options = None if i == 0 else {"quality": 85} generate_image(SRCFILE, dstfile, settings, options=options) - im = PILImage.open(dstfile) - assert im.size == size + with PILImage.open(dstfile) as im: + assert im.size == size def test_generate_image_imgformat(tmpdir): @@ -73,8 +73,8 @@ def test_generate_image_imgformat(tmpdir): ) options = {"quality": 85} generate_image(SRCFILE, dstfile, settings, options=options) - im = PILImage.open(dstfile) - assert im.format == outfmt + with PILImage.open(dstfile) as im: + assert im.format == outfmt def test_resize_image_portrait(tmpdir): @@ -89,12 +89,11 @@ def test_resize_image_portrait(tmpdir): portrait_dst = str(tmpdir.join(portrait_image)) generate_image(portrait_src, portrait_dst, settings) - im = PILImage.open(portrait_dst) - - # In the default mode, PILKit resizes in a way to never make an image - # smaller than either of the lengths, the other is scaled accordingly. - # Hence we test that the shorter side has the smallest length. - assert im.size[0] == 200 + with PILImage.open(portrait_dst) as im: + # In the default mode, PILKit resizes in a way to never make an image + # smaller than either of the lengths, the other is scaled accordingly. + # Hence we test that the shorter side has the smallest length. + assert im.size[0] == 200 landscape_image = "KeckObservatory20071020.jpg" landscape_src = os.path.join( @@ -103,8 +102,8 @@ def test_resize_image_portrait(tmpdir): landscape_dst = str(tmpdir.join(landscape_image)) generate_image(landscape_src, landscape_dst, settings) - im = PILImage.open(landscape_dst) - assert im.size[1] == 200 + with PILImage.open(landscape_dst) as im: + assert im.size[1] == 200 @pytest.mark.parametrize( @@ -158,13 +157,13 @@ def test_generate_thumbnail(tmpdir, image, path, wide_size, high_size): dstfile = str(tmpdir.join(image)) for size in [(200, 150), (150, 200)]: generate_thumbnail(path, dstfile, size) - im = PILImage.open(dstfile) - assert im.size == size + with PILImage.open(dstfile) as im: + assert im.size == size for size, thumb_size in [((200, 150), wide_size), ((150, 200), high_size)]: generate_thumbnail(path, dstfile, size, fit=False) - im = PILImage.open(dstfile) - assert im.size == thumb_size + with PILImage.open(dstfile) as im: + assert im.size == thumb_size def test_get_exif_tags():