Skip to content

Commit 1f642ff

Browse files
committed
Address code review feedback: refactor error messaging and fix test
- Refactor duplicate error messaging for missing reader handling as suggested by @ericspod - Extract common error message strings to avoid duplication - Fix test to properly verify raise_on_missing_reader=False behavior - Update test to expect warnings instead of exceptions when flag is disabled - Maintain backward compatibility with proper error handling
1 parent e332430 commit 1f642ff

File tree

3 files changed

+70
-20
lines changed

3 files changed

+70
-20
lines changed

monai/transforms/io/array.py

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -214,28 +214,20 @@ def __init__(
214214
the_reader = look_up_option(_r.lower(), SUPPORTED_READERS)
215215
except ValueError:
216216
# If the reader name is not recognized at all, raise OptionalImportError
217+
msg = f"Cannot find reader '{_r}'. It may not be installed or recognized."
217218
if self.raise_on_missing_reader:
218-
raise OptionalImportError(
219-
f"Cannot find reader '{_r}'. It may not be installed or recognized."
220-
)
219+
raise OptionalImportError(msg)
221220
else:
222-
warnings.warn(
223-
f"Cannot find reader '{_r}'. It may not be installed or recognized. "
224-
f"Will use fallback readers if available."
225-
)
221+
warnings.warn(f"{msg} Will use fallback readers if available.")
226222
continue
227223
try:
228224
self.register(the_reader(*args, **kwargs))
229225
except OptionalImportError as e:
226+
msg = f"Required package for reader {_r} is not installed, or the version doesn't match requirement."
230227
if self.raise_on_missing_reader:
231-
raise OptionalImportError(
232-
f"required package for reader {_r} is not installed, or the version doesn't match requirement."
233-
) from e
228+
raise OptionalImportError(msg) from e
234229
else:
235-
warnings.warn(
236-
f"required package for reader {_r} is not installed, or the version doesn't match requirement. "
237-
f"Will use fallback readers if available."
238-
)
230+
warnings.warn(f"{msg} Will use fallback readers if available.")
239231
except TypeError: # the reader doesn't have the corresponding args/kwargs
240232
warnings.warn(f"{_r} is not supported with the given parameters {args} {kwargs}.")
241233
self.register(the_reader())

test_my_changes.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#!/usr/bin/env python3
2+
3+
"""Test to verify the changes to LoadImage raise_on_missing_reader flag work correctly."""
4+
5+
import warnings
6+
from monai.transforms import LoadImage
7+
from monai.utils import OptionalImportError
8+
9+
def test_raise_on_missing_reader():
10+
"""Test the raise_on_missing_reader flag behavior."""
11+
print("Testing LoadImage raise_on_missing_reader flag...")
12+
13+
# Test 1: Unknown reader with flag enabled - should raise OptionalImportError
14+
print("Test 1: Unknown reader with raise_on_missing_reader=True")
15+
try:
16+
LoadImage(reader="UnknownReader", raise_on_missing_reader=True)
17+
print("FAIL: Expected OptionalImportError but didn't get one")
18+
return False
19+
except OptionalImportError as e:
20+
print(f"PASS: Got expected OptionalImportError: {e}")
21+
22+
# Test 2: Unknown reader with flag disabled - should warn but not raise
23+
print("\nTest 2: Unknown reader with raise_on_missing_reader=False")
24+
try:
25+
with warnings.catch_warnings(record=True) as w:
26+
warnings.simplefilter("always")
27+
loader = LoadImage(reader="UnknownReader", raise_on_missing_reader=False)
28+
if w and "UnknownReader" in str(w[0].message):
29+
print(f"PASS: Got expected warning: {w[0].message}")
30+
else:
31+
print("WARNING: Warning message may have been different than expected")
32+
print("PASS: LoadImage instance created successfully with fallback behavior")
33+
except OptionalImportError as e:
34+
print(f"FAIL: Unexpected OptionalImportError with flag disabled: {e}")
35+
return False
36+
except Exception as e:
37+
print(f"FAIL: Unexpected error: {e}")
38+
return False
39+
40+
# Test 3: Valid reader - should work regardless of flag
41+
print("\nTest 3: Valid reader (PILReader) with both flag settings")
42+
try:
43+
loader1 = LoadImage(reader="PILReader", raise_on_missing_reader=True)
44+
loader2 = LoadImage(reader="PILReader", raise_on_missing_reader=False)
45+
print("PASS: Both loaders created successfully with valid reader")
46+
except Exception as e:
47+
print(f"FAIL: Unexpected error with valid reader: {e}")
48+
return False
49+
50+
print("\nAll tests passed!")
51+
return True
52+
53+
if __name__ == "__main__":
54+
success = test_raise_on_missing_reader()
55+
exit(0 if success else 1)

tests/transforms/test_load_image.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -454,13 +454,16 @@ def test_raise_on_missing_reader_flag(self):
454454
with self.assertRaises(OptionalImportError):
455455
LoadImage(image_only=True, reader="UnknownReaderName", raise_on_missing_reader=True)
456456

457-
# Test with flag disabled (default) - should also raise exception for unknown reader name
458-
# because this is caught before the new flag logic
459-
with self.assertRaises(OptionalImportError):
460-
LoadImage(image_only=True, reader="UnknownReaderName", raise_on_missing_reader=False)
457+
# Test with flag disabled - should warn but not raise exception for unknown reader name
458+
# This should succeed and create the loader with fallback behavior
459+
with warnings.catch_warnings(record=True) as w:
460+
warnings.simplefilter("always")
461+
loader_with_fallback = LoadImage(image_only=True, reader="UnknownReaderName", raise_on_missing_reader=False)
462+
self.assertIsInstance(loader_with_fallback, LoadImage)
463+
# Should have produced a warning about the unknown reader
464+
self.assertTrue(any("Cannot find reader 'UnknownReaderName'" in str(warning.message) for warning in w))
461465

462-
# The flag primarily helps when reader is recognized but dependencies are missing
463-
# Since we're in an ITK test environment, let's just verify the flag exists and doesn't break normal behavior
466+
# The flag should work properly with valid readers too
464467
loader_with_flag = LoadImage(image_only=True, reader="ITKReader", raise_on_missing_reader=False)
465468
loader_without_flag = LoadImage(image_only=True, reader="ITKReader")
466469

0 commit comments

Comments
 (0)