aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Baumgartner <dev@igsor.net>2023-03-02 08:56:57 +0100
committerMatthias Baumgartner <dev@igsor.net>2023-03-02 08:56:57 +0100
commit70d77819a84c73292825b81f952e162bb30753d7 (patch)
tree60f2c9e752420338a941bb1e67af8ce52942e3d5
parent4b5c4d486bb4f0f4da2e25ad464e8336a781cdcb (diff)
downloadbsie-70d77819a84c73292825b81f952e162bb30753d7.tar.gz
bsie-70d77819a84c73292825b81f952e162bb30753d7.tar.bz2
bsie-70d77819a84c73292825b81f952e162bb30753d7.zip
reader error: untangle generic from unsupported format errors
-rw-r--r--bsie/reader/exif.py2
-rw-r--r--bsie/reader/preview/_pillow.py2
-rw-r--r--bsie/utils/errors.py2
-rw-r--r--test/reader/image/test_raw_image.py4
-rw-r--r--test/reader/preview/test_pillow.py6
-rw-r--r--test/reader/test_exif.py13
-rw-r--r--test/reader/testimage_exif_corrupted.jpgbin0 -> 551 bytes
7 files changed, 21 insertions, 8 deletions
diff --git a/bsie/reader/exif.py b/bsie/reader/exif.py
index 8c74462..2d0428b 100644
--- a/bsie/reader/exif.py
+++ b/bsie/reader/exif.py
@@ -38,7 +38,7 @@ class Exif(base.Reader):
img = pyexiv2.Image(path)
# read metadata
return img.read_exif()
- except TypeError as err:
+ except (TypeError, OSError, RuntimeError) as err:
raise errors.ReaderError(path) from err
## EOF ##
diff --git a/bsie/reader/preview/_pillow.py b/bsie/reader/preview/_pillow.py
index 15c1c6d..2b797c6 100644
--- a/bsie/reader/preview/_pillow.py
+++ b/bsie/reader/preview/_pillow.py
@@ -33,7 +33,7 @@ class PillowPreviewReader(base.Reader):
except PIL.UnidentifiedImageError as err:
# failed to open, skip file
raise errors.UnsupportedFileFormatError(path) from err
- except IOError as err:
+ except OSError as err:
raise errors.ReaderError(path) from err
# EOF ##
diff --git a/bsie/utils/errors.py b/bsie/utils/errors.py
index e71fc60..7c7e6ed 100644
--- a/bsie/utils/errors.py
+++ b/bsie/utils/errors.py
@@ -38,7 +38,7 @@ class UnreachableError(ProgrammingError):
class ParserError(_BSIEError):
"""Failed to parse due to invalid syntax or structures."""
-class UnsupportedFileFormatError(ReaderError):
+class UnsupportedFileFormatError(_BSIEError):
"""Failed to read a file format."""
## EOF ##
diff --git a/test/reader/image/test_raw_image.py b/test/reader/image/test_raw_image.py
index 0a5ed63..3b240d0 100644
--- a/test/reader/image/test_raw_image.py
+++ b/test/reader/image/test_raw_image.py
@@ -32,10 +32,10 @@ class TestRawImage(unittest.TestCase):
#self.assertEqual(img.getdata().getpixel((0, 0)), (0, 0, 0))
img.close()
# raises exception when image cannot be read
+ self.assertRaises(errors.UnsupportedFileFormatError, rdr,
+ os.path.join(os.path.dirname(__file__), 'testimage.jpg'))
self.assertRaises(errors.ReaderError, rdr,
os.path.join(os.path.dirname(__file__), 'invalid.nef'))
- self.assertRaises(errors.ReaderError, rdr,
- os.path.join(os.path.dirname(__file__), 'testimage.jpg'))
diff --git a/test/reader/preview/test_pillow.py b/test/reader/preview/test_pillow.py
index d213bbb..20f08ec 100644
--- a/test/reader/preview/test_pillow.py
+++ b/test/reader/preview/test_pillow.py
@@ -20,11 +20,15 @@ class TestPillowPreviewReader(unittest.TestCase):
def test_call(self):
rdr = PillowPreviewReader()
# raises exception when image cannot be read
- self.assertRaises(errors.ReaderError, rdr,
+ self.assertRaises(errors.UnsupportedFileFormatError, rdr,
os.path.join(os.path.dirname(__file__), 'invalid.jpg'))
+ # raises exception when image cannot be read
+ self.assertRaises(errors.ReaderError, rdr,
+ os.path.join(os.path.dirname(__file__), 'inexistent.jpg'))
# raises exception when image has invalid type
self.assertRaises(errors.UnsupportedFileFormatError, rdr,
os.path.join(os.path.dirname(__file__), 'invalid.foo'))
+
# proper file produces a generator
gen = rdr(os.path.join(os.path.dirname(__file__), 'testimage.jpg'))
self.assertIsInstance(gen, partial)
diff --git a/test/reader/test_exif.py b/test/reader/test_exif.py
index b2bf843..de6e801 100644
--- a/test/reader/test_exif.py
+++ b/test/reader/test_exif.py
@@ -3,6 +3,9 @@
import os
import unittest
+# external imports
+import pyexiv2
+
# bsie imports
from bsie.utils import errors
@@ -16,9 +19,15 @@ class TestExif(unittest.TestCase):
def test_call(self):
rdr = Exif()
# discards non-image files
- self.assertRaises(errors.UnsupportedFileFormatError, rdr, 'invalid.doc')
+ self.assertRaises(errors.UnsupportedFileFormatError, rdr,
+ os.path.join(os.path.dirname(__file__), 'invalid.doc'))
+ # raises on invalid image files
+ self.assertRaises(errors.UnsupportedFileFormatError, rdr,
+ os.path.join(os.path.dirname(__file__), 'invalid.jpg'))
# raises on invalid image files
- self.assertRaises(errors.ReaderError, rdr, 'invalid.jpg')
+ pyexiv2.set_log_level(3) # suppress log message
+ self.assertRaises(errors.ReaderError, rdr,
+ os.path.join(os.path.dirname(__file__), 'testimage_exif_corrupted.jpg'))
# returns dict with exif info
self.assertDictEqual(rdr(os.path.join(os.path.dirname(__file__), 'testimage_exif.jpg')), {
'Exif.Image.Artist': 'nobody',
diff --git a/test/reader/testimage_exif_corrupted.jpg b/test/reader/testimage_exif_corrupted.jpg
new file mode 100644
index 0000000..e51a9dc
--- /dev/null
+++ b/test/reader/testimage_exif_corrupted.jpg
Binary files differ