From f896cfb15462beaab23811511917df89bd2e6ef1 Mon Sep 17 00:00:00 2001 From: Rebecca Breu Date: Thu, 8 Jul 2021 12:52:14 +0200 Subject: [PATCH] Fix file path issues --- beeref/config.py | 3 +++ beeref/fileio/image.py | 11 +++++++++-- beeref/view.py | 5 ++++- tests/fileio/test_image.py | 10 ++++++++++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/beeref/config.py b/beeref/config.py index 76db157..70b0958 100644 --- a/beeref/config.py +++ b/beeref/config.py @@ -104,6 +104,9 @@ class BeeSettings(QtCore.QSettings): constants.APPNAME, constants.APPNAME) + def fileName(self): + return os.path.normpath(super().fileName()) + def get_settings_dir(self): # pragma: no cover args = CommandlineArgs() return args.settings_dir diff --git a/beeref/fileio/image.py b/beeref/fileio/image.py index a43ebed..67a58e1 100644 --- a/beeref/fileio/image.py +++ b/beeref/fileio/image.py @@ -22,6 +22,7 @@ from urllib import request from PyQt6 import QtGui import exif +import plum logger = logging.getLogger(__name__) @@ -37,7 +38,11 @@ def exif_rotated_image(path=None): return img with open(path, 'rb') as f: - exifimg = exif.Image(f) + try: + exifimg = exif.Image(f) + except plum.UnpackError: + logger.info(f'Exif parser failed on image: {path}') + return img if 'orientation' in exifimg.list_all(): orientation = exifimg.orientation @@ -73,9 +78,11 @@ def exif_rotated_image(path=None): def load_image(path): if isinstance(path, str): + path = os.path.normpath(path) return (exif_rotated_image(path), path) if path.isLocalFile(): - return (exif_rotated_image(path.path()), path.path()) + path = os.path.normpath(path.toLocalFile()) + return (exif_rotated_image(path), path) img = exif_rotated_image() try: diff --git a/beeref/view.py b/beeref/view.py index 487532a..99d7ff7 100644 --- a/beeref/view.py +++ b/beeref/view.py @@ -15,6 +15,7 @@ import logging import os +import os.path from PyQt6 import QtCore, QtGui, QtWidgets from PyQt6.QtCore import Qt @@ -313,6 +314,7 @@ class BeeGraphicsView(QtWidgets.QGraphicsView, ActionsMixin): caption='Open file', filter=f'{constants.APPNAME} File (*.bee)') if filename: + filename = os.path.normpath(filename) self.open_from_file(filename) self.filename = filename @@ -660,4 +662,5 @@ class BeeGraphicsView(QtWidgets.QGraphicsView, ActionsMixin): item = BeePixmapItem(img) pos = self.mapToScene(pos) self.undo_stack.push(commands.InsertItems(self.scene, [item], pos)) - logger.info('Drop not an image') + else: + logger.info('Drop not an image') diff --git a/tests/fileio/test_image.py b/tests/fileio/test_image.py index 2b5f84e..479d6ad 100644 --- a/tests/fileio/test_image.py +++ b/tests/fileio/test_image.py @@ -1,9 +1,12 @@ import math import os.path +from unittest.mock import patch import httpretty import pytest +import plum + from PyQt6 import QtCore, QtGui from beeref.fileio.image import exif_rotated_image, load_image @@ -19,6 +22,13 @@ def test_exif_rotated_image_not_a_file(qapp): assert img.isNull() is True +def test_exif_rotated_image_exif_unpack_error(qapp, imgfilename3x3): + with patch('beeref.fileio.image.exif.Image') as exif_mock: + exif_mock.raise_error = plum.UnpackError() + img = exif_rotated_image(imgfilename3x3) + assert img.isNull() is False + + @pytest.mark.parametrize('path,expected', [('test3x3.png', 'test3x3.png'), ('test3x3_orientation1.jpg', 'test3x3.jpg'),