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
7 changes: 6 additions & 1 deletion pyrit/converter/image_compression_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ def __init__(

def _build_identifier(self) -> ComponentIdentifier:
"""
Build identifier with image compression parameters.
Build identifier with image compression parameters, preserving the historical default hash.

Returns:
ComponentIdentifier: The identifier for this converter.
Expand All @@ -142,6 +142,11 @@ def _build_identifier(self) -> ComponentIdentifier:
"compress_level": self._compress_level,
"lossless": self._lossless,
"method": self._method,
"background_color": self._background_color if self._background_color != (0, 0, 0) else None,
"min_compression_threshold": (
self._min_compression_threshold if self._min_compression_threshold != 1024 else None
),
"fallback_to_original": self._fallback_to_original if not self._fallback_to_original else None,
}
)

Expand Down
70 changes: 70 additions & 0 deletions tests/unit/converter/test_image_compression_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from PIL import Image, ImageCms

from pyrit.converter import ImageCompressionConverter
from pyrit.registry import ConverterRegistry


@pytest.fixture
Expand Down Expand Up @@ -430,3 +431,72 @@ def test_image_compression_converter_preserves_rgb_icc_profile(mode: str) -> Non
with compressed_io, Image.open(compressed_io) as output:
assert output.mode == mode
assert output.info["icc_profile"] == icc_profile


@pytest.mark.parametrize(
"settings",
[
{"background_color": (255, 0, 0)},
{"min_compression_threshold": 0},
{"fallback_to_original": False},
],
)
def test_image_compression_identifier_distinguishes_output_settings(settings) -> None:
default = ImageCompressionConverter()
other = ImageCompressionConverter(**settings)
assert default.get_identifier().hash != other.get_identifier().hash

# Both configurations get their own default registry name instead of colliding.
instances = ConverterRegistry().instances
instances.register(default)
instances.register(other)
assert instances.get(default.get_identifier().unique_name) is default
assert instances.get(other.get_identifier().unique_name) is other


def test_image_compression_identifier_includes_output_settings() -> None:
params = (
ImageCompressionConverter(
background_color=(255, 0, 0),
min_compression_threshold=2048,
fallback_to_original=False,
)
.get_identifier()
.params
)
assert params["background_color"] == [255, 0, 0]
assert params["min_compression_threshold"] == 2048
assert params["fallback_to_original"] is False


def test_image_compression_identifier_keeps_default_hash() -> None:
converter = ImageCompressionConverter()
identifier = converter.get_identifier()
assert identifier.hash == "c41c060bb7d4f117cb7f98135413108d24656ad812e4916049bda7f7c4e9827d"

instances = ConverterRegistry().instances
instances.register(converter)
assert instances.get("ImageCompressionConverter::c41c060b") is converter


def test_image_compression_identifier_is_stable_for_equal_settings() -> None:
assert (
ImageCompressionConverter().get_identifier().hash
== ImageCompressionConverter(
background_color=(0, 0, 0), min_compression_threshold=1024, fallback_to_original=True
)
.get_identifier()
.hash
)
assert (
ImageCompressionConverter(
background_color=(255, 255, 255), min_compression_threshold=0, fallback_to_original=False
)
.get_identifier()
.hash
== ImageCompressionConverter(
background_color=(255, 255, 255), min_compression_threshold=0, fallback_to_original=False
)
.get_identifier()
.hash
)
Loading