From e5b85b8585de32e4c4e52c71bd1655506807d8e2 Mon Sep 17 00:00:00 2001 From: Chen Yufeiyang Date: Mon, 19 Oct 2026 13:06:52 +0800 Subject: [PATCH 1/2] FIX Include the output settings in the ImageCompressionConverter identifier --- .../converter/image_compression_converter.py | 3 + .../test_image_compression_converter.py | 60 +++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/pyrit/converter/image_compression_converter.py b/pyrit/converter/image_compression_converter.py index aa0d613d92..d48b7deab7 100644 --- a/pyrit/converter/image_compression_converter.py +++ b/pyrit/converter/image_compression_converter.py @@ -142,6 +142,9 @@ def _build_identifier(self) -> ComponentIdentifier: "compress_level": self._compress_level, "lossless": self._lossless, "method": self._method, + "background_color": self._background_color, + "min_compression_threshold": self._min_compression_threshold, + "fallback_to_original": self._fallback_to_original, } ) diff --git a/tests/unit/converter/test_image_compression_converter.py b/tests/unit/converter/test_image_compression_converter.py index cd3b763070..09b0c61031 100644 --- a/tests/unit/converter/test_image_compression_converter.py +++ b/tests/unit/converter/test_image_compression_converter.py @@ -9,6 +9,7 @@ from PIL import Image, ImageCms from pyrit.converter import ImageCompressionConverter +from pyrit.registry import ConverterRegistry @pytest.fixture @@ -430,3 +431,62 @@ 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_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 + ) From 887eb60b74f76dc19a64fb0cc9516159eee58caa Mon Sep 17 00:00:00 2001 From: Roman Lutz Date: Mon, 19 Oct 2026 22:44:16 -0700 Subject: [PATCH 2/2] FIX Preserve the default image compression identifier hash Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 11737ed7-7291-4e15-b8d5-b379f3a64ac4 --- pyrit/converter/image_compression_converter.py | 10 ++++++---- .../unit/converter/test_image_compression_converter.py | 10 ++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/pyrit/converter/image_compression_converter.py b/pyrit/converter/image_compression_converter.py index d48b7deab7..2d1ce96b0f 100644 --- a/pyrit/converter/image_compression_converter.py +++ b/pyrit/converter/image_compression_converter.py @@ -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. @@ -142,9 +142,11 @@ def _build_identifier(self) -> ComponentIdentifier: "compress_level": self._compress_level, "lossless": self._lossless, "method": self._method, - "background_color": self._background_color, - "min_compression_threshold": self._min_compression_threshold, - "fallback_to_original": self._fallback_to_original, + "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, } ) diff --git a/tests/unit/converter/test_image_compression_converter.py b/tests/unit/converter/test_image_compression_converter.py index 09b0c61031..fbdbfeb064 100644 --- a/tests/unit/converter/test_image_compression_converter.py +++ b/tests/unit/converter/test_image_compression_converter.py @@ -469,6 +469,16 @@ def test_image_compression_identifier_includes_output_settings() -> None: 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