From 831ff2ce7fc1a9552d46936db3ea8e7a86d70f67 Mon Sep 17 00:00:00 2001 From: Talhax55z Date: Sun, 29 Mar 2026 21:55:28 -0700 Subject: [PATCH 1/4] Fix: raise OptionalImportError when user-specified reader package is not installed --- monai/transforms/io/array.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/monai/transforms/io/array.py b/monai/transforms/io/array.py index f0c1d1949d..b30a29c3c1 100644 --- a/monai/transforms/io/array.py +++ b/monai/transforms/io/array.py @@ -210,10 +210,10 @@ def __init__( the_reader = look_up_option(_r.lower(), SUPPORTED_READERS) try: self.register(the_reader(*args, **kwargs)) - except OptionalImportError: - warnings.warn( + except OptionalImportError as e: + raise OptionalImportError( f"required package for reader {_r} is not installed, or the version doesn't match requirement." - ) + ) from e except TypeError: # the reader doesn't have the corresponding args/kwargs warnings.warn(f"{_r} is not supported with the given parameters {args} {kwargs}.") self.register(the_reader()) From b4c0ef11d242432f9a9a2cc4ac6c8dc795e4cdcf Mon Sep 17 00:00:00 2001 From: Talhax55z Date: Sun, 29 Mar 2026 22:20:49 -0700 Subject: [PATCH 2/4] Test: add unit test for OptionalImportError when reader package is missing --- monai/transforms/io/array.py | 4 ++++ tests/data/test_image_rw.py | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/monai/transforms/io/array.py b/monai/transforms/io/array.py index b30a29c3c1..f57f5c4319 100644 --- a/monai/transforms/io/array.py +++ b/monai/transforms/io/array.py @@ -165,6 +165,10 @@ def __init__( args: additional parameters for reader if providing a reader name. kwargs: additional parameters for reader if providing a reader name. + Raises: + OptionalImportError: if a user-specified reader requires a package + that is not installed or has an incompatible version. + Note: - The transform returns a MetaTensor, unless `set_track_meta(False)` has been used, in which case, a diff --git a/tests/data/test_image_rw.py b/tests/data/test_image_rw.py index d90c1c8571..5d00953e71 100644 --- a/tests/data/test_image_rw.py +++ b/tests/data/test_image_rw.py @@ -187,6 +187,13 @@ def test_3d(self, reader, writer): test_data = np.random.randn(8, 8, 8).astype(np.float32) self.nrrd_rw(test_data, reader, writer, np.float32) +class TestLoadImageReaderError(unittest.TestCase): + def test_missing_reader_package_raises_error(self): + class FakeReader: + def __init__(self): + raise OptionalImportError("fake_package is not installed") + with self.assertRaises(OptionalImportError): + LoadImage(reader=FakeReader) if __name__ == "__main__": unittest.main() From 5188d1f4eddbf38b87dd7181110735e471556c4f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 05:21:16 +0000 Subject: [PATCH 3/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- monai/transforms/io/array.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monai/transforms/io/array.py b/monai/transforms/io/array.py index f57f5c4319..484c7546cb 100644 --- a/monai/transforms/io/array.py +++ b/monai/transforms/io/array.py @@ -168,7 +168,7 @@ def __init__( Raises: OptionalImportError: if a user-specified reader requires a package that is not installed or has an incompatible version. - + Note: - The transform returns a MetaTensor, unless `set_track_meta(False)` has been used, in which case, a From 55f9b130d4905d526242da4c0e497f2534d6bc3e Mon Sep 17 00:00:00 2001 From: Talhax55z Date: Mon, 30 Mar 2026 00:28:46 -0700 Subject: [PATCH 4/4] Test: add docstrings and string-reader path test to TestLoadImageReaderError --- tests/data/test_image_rw.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/tests/data/test_image_rw.py b/tests/data/test_image_rw.py index 5d00953e71..28201abcea 100644 --- a/tests/data/test_image_rw.py +++ b/tests/data/test_image_rw.py @@ -188,12 +188,29 @@ def test_3d(self, reader, writer): self.nrrd_rw(test_data, reader, writer, np.float32) class TestLoadImageReaderError(unittest.TestCase): + """Tests for LoadImage error handling when reader initialization fails.""" + def test_missing_reader_package_raises_error(self): + """Verify OptionalImportError is raised when a class-based reader's package is unavailable. + + Raises: + OptionalImportError: When FakeReader is passed and its backend is missing. + """ class FakeReader: def __init__(self): raise OptionalImportError("fake_package is not installed") with self.assertRaises(OptionalImportError): LoadImage(reader=FakeReader) -if __name__ == "__main__": - unittest.main() + + @unittest.skipUnless(has_itk, "itk not installed") + def test_string_reader_missing_package_raises_error(self): + """Verify OptionalImportError is raised when a string-based reader's package is unavailable. + + Raises: + OptionalImportError: When ITKReader string is passed but itk is mocked as missing. + """ + from unittest.mock import patch + with patch("monai.transforms.io.array.optional_import", return_value=(None, False)): + with self.assertRaises((OptionalImportError, KeyError)): + LoadImage(reader="NonExistentFakeReader123")