From 9d125118da109bf187e2ca6a4b239b35b86b38b9 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Wed, 1 Jun 2022 18:52:11 +0200 Subject: [PATCH] qrreader.get_qr_reader: raise instead of returning None move MissingQrDetectionLib to core lib --- electrum/gui/qt/qrreader/__init__.py | 3 ++- .../gui/qt/qrreader/qtmultimedia/__init__.py | 2 +- .../qt/qrreader/qtmultimedia/camera_dialog.py | 8 +------ electrum/qrreader/__init__.py | 22 ++++++++++++++----- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/electrum/gui/qt/qrreader/__init__.py b/electrum/gui/qt/qrreader/__init__.py index cecd27f1f..260f8ecaa 100644 --- a/electrum/gui/qt/qrreader/__init__.py +++ b/electrum/gui/qt/qrreader/__init__.py @@ -29,6 +29,7 @@ from PyQt5.QtWidgets import QMessageBox, QWidget from electrum.i18n import _ from electrum.util import UserFacingException from electrum.logging import get_logger +from electrum.qrreader import MissingQrDetectionLib from electrum.gui.qt.util import MessageBoxMixin, custom_message_box @@ -102,7 +103,7 @@ def _scan_qrcode_using_qtmultimedia( callback: Callable[[bool, str, Optional[str]], None], ) -> None: try: - from .qtmultimedia import QrReaderCameraDialog, CameraError, MissingQrDetectionLib + from .qtmultimedia import QrReaderCameraDialog, CameraError except ImportError as e: icon = QMessageBox.Warning title = _("QR Reader Error") diff --git a/electrum/gui/qt/qrreader/qtmultimedia/__init__.py b/electrum/gui/qt/qrreader/qtmultimedia/__init__.py index 942c44d21..b159db948 100644 --- a/electrum/gui/qt/qrreader/qtmultimedia/__init__.py +++ b/electrum/gui/qt/qrreader/qtmultimedia/__init__.py @@ -26,7 +26,7 @@ from typing import Mapping from .camera_dialog import (QrReaderCameraDialog, CameraError, NoCamerasFound, - NoCameraResolutionsFound, MissingQrDetectionLib) + NoCameraResolutionsFound) from .validator import (QrReaderValidatorResult, AbstractQrReaderValidator, QrReaderValidatorCounting, QrReaderValidatorColorizing, QrReaderValidatorStrong, QrReaderValidatorCounted) diff --git a/electrum/gui/qt/qrreader/qtmultimedia/camera_dialog.py b/electrum/gui/qt/qrreader/qtmultimedia/camera_dialog.py index ae01cc982..54ad1a1c9 100644 --- a/electrum/gui/qt/qrreader/qtmultimedia/camera_dialog.py +++ b/electrum/gui/qt/qrreader/qtmultimedia/camera_dialog.py @@ -36,7 +36,7 @@ from PyQt5.QtCore import QSize, QRect, Qt, pyqtSignal, PYQT_VERSION from electrum.simple_config import SimpleConfig from electrum.i18n import _ -from electrum.qrreader import get_qr_reader, QrCodeResult +from electrum.qrreader import get_qr_reader, QrCodeResult, MissingQrDetectionLib from electrum.logging import Logger from electrum.gui.qt.util import MessageBoxMixin, FixedAspectRatioLayout, ImageGraphicsEffect @@ -58,10 +58,6 @@ class NoCamerasFound(CameraError): class NoCameraResolutionsFound(CameraError): ''' Raised internally if no usable camera resolutions were found. ''' -class MissingQrDetectionLib(RuntimeError): - ''' Raised if we can't find zbar or whatever other platform lib - we require to detect QR in image frames. ''' - class QrReaderCameraDialog(Logger, MessageBoxMixin, QDialog): """ Dialog for reading QR codes from a camera @@ -97,8 +93,6 @@ class QrReaderCameraDialog(Logger, MessageBoxMixin, QDialog): # Try to get the QR reader for this system self.qrreader = get_qr_reader() - if not self.qrreader: - raise MissingQrDetectionLib(_("The platform QR detection library is not available.")) # Set up the window, add the maximize button flags = self.windowFlags() diff --git a/electrum/qrreader/__init__.py b/electrum/qrreader/__init__.py index 2fa69a91a..3ffc37446 100644 --- a/electrum/qrreader/__init__.py +++ b/electrum/qrreader/__init__.py @@ -35,15 +35,17 @@ from .abstract_base import AbstractQrCodeReader, QrCodeResult _logger = get_logger(__name__) -class MissingLib(RuntimeError): - ''' Raised by underlying implementation if missing libs ''' - pass +class MissingQrDetectionLib(RuntimeError): + ''' Raised if we can't find zbar or whatever other platform lib + we require to detect QR in image frames. ''' -def get_qr_reader() -> Optional[AbstractQrCodeReader]: +def get_qr_reader() -> AbstractQrCodeReader: """ - Get the Qr code reader for the current platform + Get the Qr code reader for the current platform. + Might raise exception: MissingQrDetectionLib. """ + excs = [] try: from .zbar import ZbarQrCodeReader return ZbarQrCodeReader() @@ -59,5 +61,13 @@ def get_qr_reader() -> Optional[AbstractQrCodeReader]: """ except MissingLib as e: _logger.exception("") + excs.append(e) + + raise MissingQrDetectionLib(f"The platform QR detection library is not available.\nerrors: {excs!r}") + - return None +# --- Internals below (not part of external API) + +class MissingLib(RuntimeError): + ''' Raised by underlying implementation if missing libs ''' + pass