Skip to content

Commit 16ec200

Browse files
committed
IMPROVE: Propagate exceptions
- Propagate KeyError from KeyHandler - Do not catch UnsupportedMetadataOperation in metadatawidget since it will never be thrown - Fix lint
1 parent 77ee889 commit 16ec200

File tree

3 files changed

+39
-47
lines changed

3 files changed

+39
-47
lines changed

vimiv/gui/metadatawidget.py

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -121,12 +121,8 @@ def metadata_list_keys(self, n_cols: int = 3, to_term: bool = False):
121121
* ``--to-term``: Print the keys to the terminal instead.
122122
"""
123123

124-
try:
125-
keys = sorted(set(self.handler.get_keys()))
126-
_logger.debug("Successfully got keys")
127-
except metadata.UnsupportedMetadataOperation:
128-
# TODO: should actually never happen
129-
pass
124+
keys = sorted(set(self.handler.get_keys()))
125+
_logger.debug("Successfully got keys")
130126
if to_term:
131127
print(*keys, sep="\n")
132128
elif n_cols < 1:
@@ -166,12 +162,8 @@ def _update_text(self):
166162
e.strip() for e in api.settings.metadata.current_keyset.value.split(",")
167163
]
168164
_logger.debug(f"Read metadata.current_keys {keys}")
169-
try:
170-
data = self.handler.fetch_keys(keys)
171-
_logger.debug("Fetched metadata")
172-
except data.UnsupportedMetadataOperation:
173-
# TODO: should never happen
174-
pass
165+
data = self.handler.fetch_keys(keys)
166+
_logger.debug("Fetched metadata")
175167

176168
if data:
177169
self.setText(utils.format_html_table(data.values()))

vimiv/imutils/metadata.py

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,16 @@ def _get_ydimension(self):
6868
return self.reader.size().height()
6969

7070
def __getitem__(self, key: str) -> Tuple[str, str, str]:
71-
"""Intrypoint to extract the key of the image at _path.
71+
"""Entrypoint to extract the key of the image at _path.
7272
7373
Args:
7474
key: internal key to fetch.
75+
76+
Throws:
77+
KeyError
7578
"""
76-
try:
77-
key, func = super().get(key.lower())
78-
return (key, key, func())
79-
except KeyError:
80-
return ("", "", "")
79+
key, func = super().__getitem__(key.lower())
80+
return (key, key, func())
8181

8282
def get_keys(self) -> Iterable[str]:
8383
"""Returns a sequence of all available metadata keys."""
@@ -119,6 +119,9 @@ def fetch_key(self, _base_key: str) -> Tuple[str, str, str]:
119119
120120
Args:
121121
_base_key: metadata key to fetch.
122+
123+
Throws:
124+
KeyError
122125
"""
123126
self.raise_exception("Getting formatted keys")
124127

@@ -150,7 +153,7 @@ def __init__(self, filename=""):
150153
def fetch_key(self, base_key: str) -> Tuple[str, str, str]:
151154
key = base_key.rpartition(".")[2]
152155

153-
try:
156+
with contextlib.suppress(piexif.InvalidImageDateError):
154157
for ifd in self._metadata:
155158
if ifd == "thumbnail":
156159
continue
@@ -189,10 +192,7 @@ def fetch_key(self, base_key: str) -> Tuple[str, str, str]:
189192
): # (int, int) <=> numerator, denominator
190193
return (keyname, keyname, f"{val[0]}/{val[1]}")
191194

192-
except (piexif.InvalidImageDataError, KeyError):
193-
return ("", "", "")
194-
195-
return ("", "", "")
195+
raise KeyError(f"Key '{base_key}' not found")
196196

197197
def get_keys(self) -> Iterable[str]:
198198
return (
@@ -271,28 +271,23 @@ def fetch_key(self, base_key: str) -> Tuple[str, str, str]:
271271
# For backwards compability, assume it has one of the following prefixes
272272
for prefix in ["", "Exif.Image.", "Exif.Photo."]:
273273
key = f"{prefix}{base_key}"
274-
try:
275-
key_name = self._metadata[key].name
276-
277-
try:
278-
key_value = self._metadata[key].human_value
274+
key_name = self._metadata[key].name
279275

280-
# Not all metadata (i.e. IPTC) provide human_value, take raw_value
281-
except AttributeError:
282-
value = self._metadata[key].raw_value
283-
284-
# For IPTC the raw_value is a list of strings
285-
if isinstance(value, list):
286-
key_value = ", ".join(value)
287-
else:
288-
key_value = value
276+
try:
277+
key_value = self._metadata[key].human_value
289278

290-
return (key, key_name, key_value)
279+
# Not all metadata (i.e. IPTC) provide human_value, take raw_value
280+
except AttributeError:
281+
value = self._metadata[key].raw_value
291282

292-
except KeyError:
293-
_logger.debug("Key %s is invalid for the current image", key)
283+
# For IPTC the raw_value is a list of strings
284+
if isinstance(value, list):
285+
key_value = ", ".join(value)
286+
else:
287+
key_value = value
294288

295-
return ("", "", "")
289+
return (key, key_name, key_value)
290+
raise KeyError(f"Key '{base_key}' not found")
296291

297292
def get_keys(self) -> Iterable[str]:
298293
"""Return a iteable of all available metadata keys."""
@@ -361,10 +356,11 @@ def _external_handler(self) -> ExternalKeyHandler:
361356
def fetch_keys(self, desired_keys: Sequence[str]) -> Dict[Any, Tuple[str, str]]:
362357
"""Extracts a list of metadata keys.
363358
364-
Throws: UnsupportedMetadataOperation.
365-
366359
Args:
367360
desired_keys: list of metadata keys to extract.
361+
362+
Throws:
363+
UnsupportedMetadataOperation
368364
"""
369365
metadata = dict()
370366

@@ -382,10 +378,12 @@ def fetch_keys(self, desired_keys: Sequence[str]) -> Dict[Any, Tuple[str, str]]:
382378
def fetch_key(self, key: str) -> Tuple[str, str, str]:
383379
"""Extracts a single metadata key.
384380
385-
Throws: UnsupportedMetadataOperation.
386-
387381
Args:
388382
key: single metadata key to extract.
383+
384+
Throws:
385+
UnsupportedMetadataOperation
386+
KeyError
389387
"""
390388
if key.lower().startswith("vimiv"):
391389
return self._internal_handler[key]
@@ -394,7 +392,8 @@ def fetch_key(self, key: str) -> Tuple[str, str, str]:
394392
def get_keys(self) -> Iterable[str]:
395393
"""Retrieve the name of all metadata keys available.
396394
397-
Throws: UnsupportedMetadataOperation
395+
Throws:
396+
UnsupportedMetadataOperation
398397
"""
399398
return itertools.chain(
400399
self._internal_handler.get_keys(), self._external_handler.get_keys()

vimiv/version.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ def info() -> str:
4242
f"Qt: {QT_VERSION_STR}\n"
4343
f"PyQt: {PYQT_VERSION_STR}\n\n"
4444
f"Svg Support: {bool(QtSvg)}\n"
45-
f"Pyexiv2: {metadata.pyexiv2.__version__ if metadata.pyexiv2 is not None else None}\n"
45+
"Pyexiv2: "
46+
f"{metadata.pyexiv2.__version__ if metadata.pyexiv2 is not None else None}\n"
4647
f"Piexif: {metadata.piexif.VERSION if metadata.piexif is not None else None}"
4748
)
4849

0 commit comments

Comments
 (0)