Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/test-matrix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
- ["ubuntu", "ubuntu-latest"]
config:
# [Python version, visual name, tox env]
- ["3.13", "6.2 on py3.13", "py313-plone62"]
- ["3.14", "6.2 on py3.14", "py314-plone62"]
- ["3.10", "6.2 on py3.10", "py310-plone62"]

runs-on: ${{ matrix.os[1] }}
Expand Down
2 changes: 1 addition & 1 deletion .meta.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# See the inline comments on how to expand/tweak this configuration file
[meta]
template = "default"
commit-id = "2.2.1"
commit-id = "2.5.1"

[tox]
test_matrix = {"6.2" = ["*"]}
Expand Down
6 changes: 3 additions & 3 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ repos:
rev: v3.21.2
hooks:
- id: pyupgrade
args: [--py38-plus]
args: [--py310-plus]
- repo: https://github.com/pycqa/isort
rev: 7.0.0
rev: 8.0.1
hooks:
- id: isort
- repo: https://github.com/psf/black-pre-commit-mirror
rev: 25.12.0
rev: 26.1.0
hooks:
- id: black
- repo: https://github.com/collective/zpretty
Expand Down
2 changes: 2 additions & 0 deletions news/+meta.internal
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Update configuration files.
[plone devs]
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# https://github.com/plone/meta/tree/main/src/plone/meta/default
# See the inline comments on how to expand/tweak this configuration file
[build-system]
requires = ["setuptools>=68.2,<80", "wheel"]
requires = ["setuptools>=68.2,<83", "wheel"]

[tool.towncrier]
directory = "news/"
Expand Down Expand Up @@ -60,7 +60,7 @@ profile = "plone"
##

[tool.black]
target-version = ["py38"]
target-version = ["py310"]

##
# Add extra configuration options in .meta.toml:
Expand Down
1 change: 0 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from pathlib import Path
from setuptools import setup


version = "5.0.0a4.dev0"

long_description = (
Expand Down
8 changes: 3 additions & 5 deletions src/plone/scale/scale.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,8 @@
import PIL.ImageSequence
import re
import sys
import typing
import warnings


try:
# Pillow 9.1.0+
LANCZOS = PIL.Image.Resampling.LANCZOS
Expand Down Expand Up @@ -567,10 +565,10 @@ def _contain_svg_image(root, target_width: int, target_height: int):

def scale_svg_image(
image: io.BytesIO,
target_width: typing.Union[None, int],
target_height: typing.Union[None, int],
target_width: None | int,
target_height: None | int,
mode: str = "contain",
) -> typing.Tuple[bytes, typing.Tuple[int, int]]:
) -> tuple[bytes, tuple[int, int]]:
"""Scale and crop a SVG image to another display size.

This is all about scaling for the display in a web browser.
Expand Down
1 change: 0 additions & 1 deletion src/plone/scale/storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import logging
import pprint


try:
from plone.protect.utils import safeWrite
except ImportError:
Expand Down
1 change: 0 additions & 1 deletion src/plone/scale/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from pathlib import Path


TEST_DATA_LOCATION = Path(__file__).parent / "data"
15 changes: 7 additions & 8 deletions src/plone/scale/tests/test_scale.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import PIL.ImageDraw
import warnings


PNG = (TEST_DATA_LOCATION / "logo.png").read_bytes()
GIF = (TEST_DATA_LOCATION / "logo.gif").read_bytes()
TIFF = (TEST_DATA_LOCATION / "logo.tiff").read_bytes()
Expand All @@ -28,7 +27,7 @@

class ScalingTests(TestCase):
def testNewSizeReturned(self):
(imagedata, format, size) = scaleImage(PNG, 42, 51, "contain")
imagedata, format, size = scaleImage(PNG, 42, 51, "contain")
input = StringIO(imagedata)
image = PIL.Image.open(input)
self.assertEqual(image.size, size)
Expand Down Expand Up @@ -70,7 +69,7 @@ def testAlphaForcesPNG(self):
self.assertEqual(scaleImage(result, 84, 103, "contain")[1], "PNG")

def testScaledCMYKIsRGB(self):
(imagedata, format, size) = scaleImage(CMYK, 42, 51, "contain")
imagedata, format, size = scaleImage(CMYK, 42, 51, "contain")
input = StringIO(imagedata)
image = PIL.Image.open(input)
self.assertEqual(image.mode, "RGB")
Expand All @@ -79,20 +78,20 @@ def testScaledPngImageIsPng(self):
self.assertEqual(scaleImage(PNG, 84, 103, "contain")[1], "PNG")

def testScaledPreservesProfile(self):
(imagedata, format, size) = scaleImage(PROFILE, 42, 51, "contain")
imagedata, format, size = scaleImage(PROFILE, 42, 51, "contain")
input = StringIO(imagedata)
image = PIL.Image.open(input)
self.assertIsNotNone(image.info.get("icc_profile"))

def testScaleWithFewColorsStaysColored(self):
(imagedata, format, size) = scaleImage(PROFILE, 16, None, "contain")
imagedata, format, size = scaleImage(PROFILE, 16, None, "contain")
image = PIL.Image.open(StringIO(imagedata))
self.assertEqual(max(image.size), 16)
self.assertEqual(image.mode, "RGB")
self.assertEqual(image.format, "JPEG")

def testScaledWebp(self):
(imagedata, format, size) = scaleImage(PROFILE_WEBP, 120, 120)
imagedata, format, size = scaleImage(PROFILE_WEBP, 120, 120)
self.assertEqual(format, "WEBP")
self.assertEqual(size, (120, 120))
self.assertTrue(len(imagedata) < len(PROFILE_WEBP))
Expand All @@ -107,7 +106,7 @@ def testAutomaticGreyscale(self):
draw.line(((0, i), (256, i)), fill=(i, i, i))
result = StringIO()
src.save(result, "JPEG")
(imagedata, format, size) = scaleImage(result, 200, None, "contain")
imagedata, format, size = scaleImage(result, 200, None, "contain")
image = PIL.Image.open(StringIO(imagedata))
self.assertEqual(max(image.size), 200)
self.assertEqual(image.mode, "L")
Expand Down Expand Up @@ -162,7 +161,7 @@ def testAutomaticPalette(self):
self.assertEqual(png.format, "PNG")
self.assertIsNone(png.getcolors(maxcolors=256))
# scale it to a size where we get less than 256 colors
(imagedata, format, size) = scaleImage(dst.getvalue(), 24, None, "contain")
imagedata, format, size = scaleImage(dst.getvalue(), 24, None, "contain")
image = PIL.Image.open(StringIO(imagedata))
# we should now have an image in palette mode
self.assertEqual(image.mode, "P")
Expand Down
1 change: 0 additions & 1 deletion src/plone/scale/tests/test_storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import zope.annotation.attribute
import zope.annotation.interfaces


_marker = object()


Expand Down
4 changes: 4 additions & 0 deletions tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ min_version = 4.4.0
envlist =
lint
test
py314-plone62
py313-plone62
py312-plone62
py311-plone62
Expand All @@ -18,6 +19,7 @@ envlist =
# Add extra configuration options in .meta.toml:
# - to specify a custom testing combination of Plone and python versions, use `test_matrix`
# Use ["*"] to use all supported Python versions for this Plone version.
# - to disable the test matrix entirely, set `use_test_matrix = false`
# - to specify extra custom environments, use `envlist_lines`
# - to specify extra `tox` top-level options, use `config_lines`
# [tox]
Expand Down Expand Up @@ -62,6 +64,7 @@ description = check if the package defines all its dependencies
skip_install = true
deps =
build
setuptools<82.0.0
z3c.dependencychecker==2.14.3
commands =
python -m build --sdist
Expand Down Expand Up @@ -130,6 +133,7 @@ extras =
##
# Add extra configuration options in .meta.toml:
# [tox]
# skip_test_extra = true
# test_extras = """
# tests
# widgets
Expand Down