diff --git a/MANIFEST.in b/MANIFEST.in index 7bfefe740..9b413cbdd 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -11,7 +11,7 @@ recursive-include openlp *.ttf recursive-include documentation * recursive-include resources * recursive-include scripts * -recursive-include tests/resources * +recursive-include tests * include copyright.txt include LICENSE include README.txt diff --git a/openlp/core/api/__init__.py b/openlp/core/api/__init__.py index f3081d022..711ded4ae 100644 --- a/openlp/core/api/__init__.py +++ b/openlp/core/api/__init__.py @@ -19,10 +19,3 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### - -from openlp.core.api.http import register_endpoint, requires_auth -from openlp.core.api.http.endpoint import Endpoint -from openlp.core.api.poll import Poller -from openlp.core.api.tab import ApiTab - -__all__ = ['Endpoint', 'ApiTab', 'register_endpoint', 'requires_auth'] diff --git a/openlp/core/api/endpoint/__init__.py b/openlp/core/api/endpoint/__init__.py index ffc1d8628..b6feaac79 100644 --- a/openlp/core/api/endpoint/__init__.py +++ b/openlp/core/api/endpoint/__init__.py @@ -22,4 +22,3 @@ """ The Endpoint class, which provides plugins with a way to serve their own portion of the API """ -from .pluginhelpers import search, live, service diff --git a/openlp/core/api/http/__init__.py b/openlp/core/api/http/__init__.py index 9b8086519..176f87fbb 100644 --- a/openlp/core/api/http/__init__.py +++ b/openlp/core/api/http/__init__.py @@ -27,7 +27,6 @@ from webob import Response from openlp.core.api.http.wsgiapp import WSGIApplication from openlp.core.common.settings import Settings -from .errors import NotFound, ServerError, HttpError application = WSGIApplication('api') diff --git a/openlp/core/api/poll.py b/openlp/core/api/poll.py index b3149d470..d438a18a9 100644 --- a/openlp/core/api/poll.py +++ b/openlp/core/api/poll.py @@ -90,7 +90,7 @@ class Poller(RegistryProperties): if self.stage_cache is None: try: page = get_web_page("http://localhost:4316/stage") - except: + except Exception: page = None if page: self.stage_cache = True @@ -106,7 +106,7 @@ class Poller(RegistryProperties): if self.live_cache is None: try: page = get_web_page("http://localhost:4316/main") - except: + except Exception: page = None if page: self.live_cache = True @@ -122,7 +122,7 @@ class Poller(RegistryProperties): if self.chords_cache is None: try: page = get_web_page("http://localhost:4316/chords") - except: + except Exception: page = None if page: self.chords_cache = True diff --git a/openlp/core/common/i18n.py b/openlp/core/common/i18n.py index 73591f83e..985d2f486 100644 --- a/openlp/core/common/i18n.py +++ b/openlp/core/common/i18n.py @@ -23,7 +23,6 @@ The :mod:`languages` module provides a list of language names with utility functions. """ import itertools -import locale import logging import re from collections import namedtuple @@ -53,8 +52,7 @@ def translate(context, text, comment=None, qt_translate=QtCore.QCoreApplication. Language = namedtuple('Language', ['id', 'name', 'code']) -ICU_COLLATOR = None -DIGITS_OR_NONDIGITS = re.compile(r'\d+|\D+') +COLLATOR = None LANGUAGES = sorted([ Language(1, translate('common.languages', '(Afan) Oromo', 'Language code: om'), 'om'), Language(2, translate('common.languages', 'Abkhazian', 'Language code: ab'), 'ab'), @@ -507,24 +505,19 @@ def format_time(text, local_time): return re.sub(r'\%[a-zA-Z]', match_formatting, text) -def get_locale_key(string): +def get_locale_key(string, numeric=False): """ Creates a key for case insensitive, locale aware string sorting. :param string: The corresponding string. """ string = string.lower() - # ICU is the prefered way to handle locale sort key, we fallback to locale.strxfrm which will work in most cases. - global ICU_COLLATOR - try: - if ICU_COLLATOR is None: - import icu - language = LanguageManager.get_language() - icu_locale = icu.Locale(language) - ICU_COLLATOR = icu.Collator.createInstance(icu_locale) - return ICU_COLLATOR.getSortKey(string) - except: - return locale.strxfrm(string).encode() + global COLLATOR + if COLLATOR is None: + language = LanguageManager.get_language() + COLLATOR = QtCore.QCollator(QtCore.QLocale(language)) + COLLATOR.setNumericMode(numeric) + return COLLATOR.sortKey(string) def get_natural_key(string): @@ -534,13 +527,7 @@ def get_natural_key(string): :param string: string to be sorted by Returns a list of string compare keys and integers. """ - key = DIGITS_OR_NONDIGITS.findall(string) - key = [int(part) if part.isdigit() else get_locale_key(part) for part in key] - # Python 3 does not support comparison of different types anymore. So make sure, that we do not compare str - # and int. - if string and string[0].isdigit(): - return [b''] + key - return key + return get_locale_key(string, True) def get_language(name): diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index 69a385e30..3df98f15d 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -409,7 +409,7 @@ class Manager(object): self.session.rollback() log.exception('Object list save failed') return False - except: + except Exception: self.session.rollback() raise @@ -439,7 +439,7 @@ class Manager(object): self.session.rollback() log.exception('Object list save failed') return False - except: + except Exception: self.session.rollback() raise @@ -556,7 +556,7 @@ class Manager(object): self.session.rollback() log.exception('Failed to delete object') return False - except: + except Exception: self.session.rollback() raise else: @@ -591,7 +591,7 @@ class Manager(object): self.session.rollback() log.exception('Failed to delete {name} records'.format(name=object_class.__name__)) return False - except: + except Exception: self.session.rollback() raise diff --git a/openlp/core/projectors/manager.py b/openlp/core/projectors/manager.py index 390b7a451..fef254b4d 100644 --- a/openlp/core/projectors/manager.py +++ b/openlp/core/projectors/manager.py @@ -471,7 +471,7 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM projector = list_item.data(QtCore.Qt.UserRole) try: projector.link.set_shutter_closed() - except: + except Exception: continue def on_doubleclick_item(self, item, opt=None): @@ -486,7 +486,7 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM try: log.debug('ProjectorManager: Calling connect_to_host() on "{ip}"'.format(ip=projector.link.ip)) projector.link.connect_to_host() - except: + except Exception: log.debug('ProjectorManager: "{ip}" already connected - skipping'.format(ip=projector.link.ip)) return @@ -505,7 +505,7 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM projector = list_item.data(QtCore.Qt.UserRole) try: projector.link.connect_to_host() - except: + except Exception: continue def on_delete_projector(self, opt=None): @@ -587,7 +587,7 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM projector = list_item.data(QtCore.Qt.UserRole) try: projector.link.disconnect_from_host() - except: + except Exception: continue def on_edit_projector(self, opt=None): @@ -620,7 +620,7 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM projector = list_item.data(QtCore.Qt.UserRole) try: projector.link.set_power_off() - except: + except Exception: continue def on_poweron_projector(self, opt=None): @@ -638,7 +638,7 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM projector = list_item.data(QtCore.Qt.UserRole) try: projector.link.set_power_on() - except: + except Exception: continue def on_show_projector(self, opt=None): @@ -656,7 +656,7 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM projector = list_item.data(QtCore.Qt.UserRole) try: projector.link.set_shutter_open() - except: + except Exception: continue def on_status_projector(self, opt=None): diff --git a/openlp/core/ui/exceptiondialog.py b/openlp/core/ui/exceptiondialog.py index 6abc741bc..a533f020b 100644 --- a/openlp/core/ui/exceptiondialog.py +++ b/openlp/core/ui/exceptiondialog.py @@ -23,7 +23,7 @@ The GUI widgets of the exception dialog. """ -from PyQt5 import QtGui, QtWidgets +from PyQt5 import QtWidgets from openlp.core.common.i18n import translate from openlp.core.lib.ui import create_button, create_button_box diff --git a/openlp/core/ui/exceptionform.py b/openlp/core/ui/exceptionform.py index f2234091e..310ba2a2e 100644 --- a/openlp/core/ui/exceptionform.py +++ b/openlp/core/ui/exceptionform.py @@ -26,8 +26,36 @@ import logging import os import platform import re +import bs4 +import sqlalchemy +from PyQt5 import Qt, QtCore, QtGui, QtWebKit, QtWidgets +from lxml import etree -from PyQt5 import QtCore, QtGui, QtWidgets +try: + import migrate + MIGRATE_VERSION = getattr(migrate, '__version__', '< 0.7') +except ImportError: + MIGRATE_VERSION = '-' +try: + import chardet + CHARDET_VERSION = chardet.__version__ +except ImportError: + CHARDET_VERSION = '-' +try: + import enchant + ENCHANT_VERSION = enchant.__version__ +except ImportError: + ENCHANT_VERSION = '-' +try: + import mako + MAKO_VERSION = mako.__version__ +except ImportError: + MAKO_VERSION = '-' +try: + from openlp.core.ui.media.vlcplayer import VERSION + VLC_VERSION = VERSION +except ImportError: + VLC_VERSION = '-' from openlp.core.common import is_linux from openlp.core.common.i18n import UiStrings, translate @@ -76,9 +104,15 @@ class ExceptionForm(QtWidgets.QDialog, Ui_ExceptionDialog, RegistryProperties): description = self.description_text_edit.toPlainText() traceback = self.exception_text_edit.toPlainText() system = translate('OpenLP.ExceptionForm', 'Platform: {platform}\n').format(platform=platform.platform()) - library_versions = get_library_versions() - library_versions['PyUNO'] = self._get_pyuno_version() - libraries = '\n'.join(['{}: {}'.format(library, version) for library, version in library_versions.items()]) + libraries = ('Python: {python}\nQt5: {qt5}\nPyQt5: {pyqt5}\nSQLAlchemy: {sqalchemy}\n' + 'SQLAlchemy Migrate: {migrate}\nBeautifulSoup: {soup}\nlxml: {etree}\nChardet: {chardet}\n' + 'PyEnchant: {enchant}\nMako: {mako}\npyUNO bridge: {uno}\n' + 'VLC: {vlc}\n').format(python=platform.python_version(), qt5=Qt.qVersion(), + pyqt5=Qt.PYQT_VERSION_STR, + sqalchemy=sqlalchemy.__version__, migrate=MIGRATE_VERSION, + soup=bs4.__version__, etree=etree.__version__, chardet=CHARDET_VERSION, + enchant=ENCHANT_VERSION, mako=MAKO_VERSION, + uno=self._pyuno_import(), vlc=VLC_VERSION) if is_linux(): if os.environ.get('KDE_FULL_SESSION') == 'true': @@ -194,5 +228,5 @@ class ExceptionForm(QtWidgets.QDialog, Ui_ExceptionDialog, RegistryProperties): return node.getByName('ooSetupVersion') except ImportError: return '-' - except: + except Exception: return '- (Possible non-standard UNO installation)' diff --git a/openlp/core/ui/icons.py b/openlp/core/ui/icons.py index 08d97da02..c5956884a 100644 --- a/openlp/core/ui/icons.py +++ b/openlp/core/ui/icons.py @@ -174,9 +174,9 @@ class UiIcons(object): setattr(self, key, qta.icon(icon)) except Exception: import sys - log.error("Unexpected error: %s" % sys.exc_info()) + log.error('Unexpected error: %s' % sys.exc_info()) setattr(self, key, qta.icon('fa.plus-circle', color='red')) - except: + except Exception: setattr(self, key, qta.icon('fa.plus-circle', color='red')) self.main_icon = build_icon(':/icon/openlp-logo.svg') diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index af821444c..53028fc48 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -51,7 +51,7 @@ from openlp.core.ui.aboutform import AboutForm from openlp.core.ui.firsttimeform import FirstTimeForm from openlp.core.ui.formattingtagform import FormattingTagForm from openlp.core.ui.icons import UiIcons -from openlp.core.ui.media import MediaController +from openlp.core.ui.media.mediacontroller import MediaController from openlp.core.ui.pluginform import PluginForm from openlp.core.ui.printserviceform import PrintServiceForm from openlp.core.ui.servicemanager import ServiceManager diff --git a/openlp/core/ui/media/__init__.py b/openlp/core/ui/media/__init__.py index 976e0b744..411b93180 100644 --- a/openlp/core/ui/media/__init__.py +++ b/openlp/core/ui/media/__init__.py @@ -142,10 +142,3 @@ def format_milliseconds(milliseconds): minutes=minutes, seconds=seconds, millis=millis) - - -from .mediacontroller import MediaController -from .playertab import PlayerTab -from .endpoint import media_endpoint - -__all__ = ['MediaController', 'PlayerTab'] diff --git a/openlp/core/ui/media/vendor/mediainfoWrapper.py b/openlp/core/ui/media/vendor/mediainfoWrapper.py index 3ef7ae6e8..e0ec21c92 100644 --- a/openlp/core/ui/media/vendor/mediainfoWrapper.py +++ b/openlp/core/ui/media/vendor/mediainfoWrapper.py @@ -38,7 +38,7 @@ class Track(object): def __getattribute__(self, name): try: return object.__getattribute__(self, name) - except: + except Exception: pass return None @@ -64,14 +64,14 @@ class Track(object): try: primary = o.replace('other_', '') setattr(self, primary, int(getattr(self, primary))) - except: + except Exception: for v in getattr(self, o): try: current = getattr(self, primary) setattr(self, primary, int(v)) getattr(self, o).append(current) break - except: + except Exception: pass def __repr__(self): diff --git a/openlp/core/ui/media/vlcplayer.py b/openlp/core/ui/media/vlcplayer.py index 6931c7d04..96efaca71 100644 --- a/openlp/core/ui/media/vlcplayer.py +++ b/openlp/core/ui/media/vlcplayer.py @@ -70,7 +70,7 @@ def get_vlc(): is_vlc_available = False try: is_vlc_available = bool(sys.modules['openlp.core.ui.media.vendor.vlc'].get_default_instance()) - except: + except Exception: pass if is_vlc_available: return sys.modules['openlp.core.ui.media.vendor.vlc'] @@ -107,7 +107,7 @@ def get_vlc(): if is_vlc_available: try: VERSION = vlc.libvlc_get_version().decode('UTF-8') - except: + except Exception: VERSION = '0.0.0' # LooseVersion does not work when a string contains letter and digits (e. g. 2.0.5 Twoflower). # http://bugs.python.org/issue14894 @@ -131,7 +131,7 @@ if is_linux() and 'nose' not in sys.argv[0] and get_vlc(): # If libx11.so.6 was not found, fallback to more generic libx11.so x11 = ctypes.cdll.LoadLibrary('libX11.so') x11.XInitThreads() - except: + except Exception: log.exception('Failed to run XInitThreads(), VLC might not work properly!') diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index d42a5cdd5..53006a938 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -704,7 +704,7 @@ class ServiceManager(QtWidgets.QWidget, RegistryBase, Ui_ServiceManager, LogMixi Settings().setValue('servicemanager/last file', file_path) else: raise ValidationError(msg='No service data found') - except (NameError, OSError, ValidationError, zipfile.BadZipFile) as e: + except (NameError, OSError, ValidationError, zipfile.BadZipFile): self.log_exception('Problem loading service file {name}'.format(name=file_path)) critical_error_message_box( message=translate('OpenLP.ServiceManager', diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py index fc70449c5..989a5965f 100644 --- a/openlp/core/ui/settingsform.py +++ b/openlp/core/ui/settingsform.py @@ -33,8 +33,9 @@ from openlp.core.lib import build_icon from openlp.core.projectors.tab import ProjectorTab from openlp.core.ui.advancedtab import AdvancedTab from openlp.core.ui.generaltab import GeneralTab -from openlp.core.ui.media import PlayerTab from openlp.core.ui.screenstab import ScreensTab +from openlp.core.ui.themestab import ThemesTab +from openlp.core.ui.media.playertab import PlayerTab from openlp.core.ui.settingsdialog import Ui_SettingsDialog from openlp.core.ui.themestab import ThemesTab diff --git a/openlp/core/version.py b/openlp/core/version.py index b19cac2d2..3a405c7dd 100644 --- a/openlp/core/version.py +++ b/openlp/core/version.py @@ -25,11 +25,9 @@ The :mod:`openlp.core.version` module downloads the version details for OpenLP. import logging import platform import sys -import time from collections import OrderedDict from datetime import date from distutils.version import LooseVersion -from subprocess import PIPE, Popen import requests from PyQt5 import QtCore diff --git a/openlp/core/widgets/edits.py b/openlp/core/widgets/edits.py index c0a4e8072..5f96e120d 100644 --- a/openlp/core/widgets/edits.py +++ b/openlp/core/widgets/edits.py @@ -31,7 +31,6 @@ from openlp.core.common import CONTROL_CHARS from openlp.core.common.i18n import UiStrings, translate from openlp.core.common.path import Path, path_to_str, str_to_path from openlp.core.common.settings import Settings -from openlp.core.lib import build_icon from openlp.core.lib.formattingtags import FormattingTags from openlp.core.lib.ui import create_action, create_widget_action from openlp.core.ui.icons import UiIcons diff --git a/openlp/core/widgets/views.py b/openlp/core/widgets/views.py index d194f891a..9aaaa36d8 100644 --- a/openlp/core/widgets/views.py +++ b/openlp/core/widgets/views.py @@ -146,7 +146,6 @@ class ListPreviewWidget(QtWidgets.QTableWidget, RegistryProperties): try: self.cellWidget(row, 0).children()[1].setMaximumWidth(new_height * self.screen_ratio) except Exception: - # TODO: Figure out what sort of exceptions are thrown return def screen_size_changed(self, screen_ratio): diff --git a/openlp/core/widgets/wizard.py b/openlp/core/widgets/wizard.py index b4063549f..3ce4f4fbc 100644 --- a/openlp/core/widgets/wizard.py +++ b/openlp/core/widgets/wizard.py @@ -31,7 +31,6 @@ from openlp.core.common.i18n import UiStrings, translate from openlp.core.common.mixins import RegistryProperties from openlp.core.common.registry import Registry from openlp.core.common.settings import Settings -from openlp.core.lib import build_icon from openlp.core.lib.ui import add_welcome_page from openlp.core.ui.icons import UiIcons from openlp.core.widgets.dialogs import FileDialog diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index a24775a8d..e1213aac1 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -34,9 +34,10 @@ from openlp.core.lib.theme import VerticalType from openlp.core.lib.ui import create_action from openlp.core.ui import AlertLocation from openlp.core.ui.icons import UiIcons -from openlp.plugins.alerts.endpoint import alerts_endpoint, api_alerts_endpoint -from openlp.plugins.alerts.forms import AlertForm -from openlp.plugins.alerts.lib import AlertsManager, AlertsTab +from openlp.plugins.alerts.endpoint import api_alerts_endpoint, alerts_endpoint +from openlp.plugins.alerts.forms.alertform import AlertForm +from openlp.plugins.alerts.lib.alertsmanager import AlertsManager +from openlp.plugins.alerts.lib.alertstab import AlertsTab from openlp.plugins.alerts.lib.db import init_schema diff --git a/openlp/plugins/alerts/endpoint.py b/openlp/plugins/alerts/endpoint.py index a002ca435..84049c254 100644 --- a/openlp/plugins/alerts/endpoint.py +++ b/openlp/plugins/alerts/endpoint.py @@ -22,7 +22,6 @@ import json import logging import urllib -from urllib.parse import urlparse from openlp.core.api.http import requires_auth from openlp.core.api.http.endpoint import Endpoint diff --git a/openlp/plugins/alerts/forms/__init__.py b/openlp/plugins/alerts/forms/__init__.py index 2e4e41ec7..cc6832d38 100644 --- a/openlp/plugins/alerts/forms/__init__.py +++ b/openlp/plugins/alerts/forms/__init__.py @@ -40,5 +40,3 @@ mentioned above, like so:: This allows OpenLP to use ``self.object`` for all the GUI elements while keeping them separate from the functionality, so that it is easier to recreate the GUI from the .ui files later if necessary. """ - -from .alertform import AlertForm diff --git a/openlp/plugins/alerts/lib/__init__.py b/openlp/plugins/alerts/lib/__init__.py index 4aae58891..711ded4ae 100644 --- a/openlp/plugins/alerts/lib/__init__.py +++ b/openlp/plugins/alerts/lib/__init__.py @@ -19,6 +19,3 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### - -from .alertsmanager import AlertsManager -from .alertstab import AlertsTab diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 645eff6f7..3efc60af5 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -25,14 +25,14 @@ import logging from openlp.core.api.http import register_endpoint from openlp.core.common.actions import ActionList from openlp.core.common.i18n import UiStrings, translate -from openlp.core.lib import build_icon +from openlp.core.ui.icons import UiIcons from openlp.core.lib.plugin import Plugin, StringContent from openlp.core.lib.ui import create_action -from openlp.core.ui.icons import UiIcons from openlp.plugins.bibles.endpoint import api_bibles_endpoint, bibles_endpoint -from openlp.plugins.bibles.lib import BibleManager, BibleMediaItem, BiblesTab, DisplayStyle, LanguageSelection, \ - LayoutStyle -from openlp.plugins.bibles.lib.mediaitem import BibleSearch +from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, LanguageSelection +from openlp.plugins.bibles.lib.biblestab import BiblesTab +from openlp.plugins.bibles.lib.manager import BibleManager +from openlp.plugins.bibles.lib.mediaitem import BibleMediaItem, BibleSearch log = logging.getLogger(__name__) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 8a56c0e59..5ff106775 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -28,6 +28,12 @@ import urllib.error from lxml import etree from PyQt5 import QtWidgets +try: + from pysword import modules + PYSWORD_AVAILABLE = True +except ImportError: + PYSWORD_AVAILABLE = False + from openlp.core.common import trace_error_handler from openlp.core.common.applocation import AppLocation from openlp.core.common.i18n import UiStrings, get_locale_key, translate @@ -42,13 +48,6 @@ from openlp.plugins.bibles.lib.importers.http import BGExtract, BSExtract, CWExt from openlp.plugins.bibles.lib.manager import BibleFormat -try: - from pysword import modules - PYSWORD_AVAILABLE = True -except: - PYSWORD_AVAILABLE = False - - log = logging.getLogger(__name__) @@ -585,7 +584,7 @@ class BibleImportForm(OpenLPWizard): (WebDownload.Bibleserver, BSExtract())): try: bibles = extractor.get_bibles_from_http() - except (urllib.error.URLError, ConnectionError) as err: + except (urllib.error.URLError, ConnectionError): critical_error_message_box(translate('BiblesPlugin.ImportWizardForm', 'Error during download'), translate('BiblesPlugin.ImportWizardForm', 'An error occurred while downloading the list of bibles from %s.')) @@ -615,7 +614,7 @@ class BibleImportForm(OpenLPWizard): self.sword_bible_combo_box.clear() for key in bible_keys: self.sword_bible_combo_box.addItem(self.pysword_folder_modules_json[key]['description'], key) - except: + except Exception: self.sword_bible_combo_box.clear() def on_sword_zipfile_path_edit_path_changed(self, new_path): @@ -630,7 +629,7 @@ class BibleImportForm(OpenLPWizard): self.sword_zipbible_combo_box.clear() for key in bible_keys: self.sword_zipbible_combo_box.addItem(self.pysword_zip_modules_json[key]['description'], key) - except: + except Exception: self.sword_zipbible_combo_box.clear() def register_fields(self): diff --git a/openlp/plugins/bibles/lib/__init__.py b/openlp/plugins/bibles/lib/__init__.py index b1a51bfd7..e8e7a1bf6 100644 --- a/openlp/plugins/bibles/lib/__init__.py +++ b/openlp/plugins/bibles/lib/__init__.py @@ -424,9 +424,3 @@ class SearchResults(object): Returns whether or not the verse list contains verses. """ return len(self.verse_list) > 0 - - -from .versereferencelist import VerseReferenceList -from .manager import BibleManager -from .biblestab import BiblesTab -from .mediaitem import BibleMediaItem diff --git a/openlp/plugins/bibles/lib/importers/csvbible.py b/openlp/plugins/bibles/lib/importers/csvbible.py index 2edfc14e8..8b0e9a3ac 100644 --- a/openlp/plugins/bibles/lib/importers/csvbible.py +++ b/openlp/plugins/bibles/lib/importers/csvbible.py @@ -54,7 +54,6 @@ from collections import namedtuple from openlp.core.common import get_file_encoding from openlp.core.common.i18n import translate -from openlp.core.common.path import Path from openlp.core.lib.exceptions import ValidationError from openlp.plugins.bibles.lib.bibleimport import BibleImport diff --git a/openlp/plugins/bibles/lib/importers/http.py b/openlp/plugins/bibles/lib/importers/http.py index 9aa8e42db..a550e6882 100644 --- a/openlp/plugins/bibles/lib/importers/http.py +++ b/openlp/plugins/bibles/lib/importers/http.py @@ -750,7 +750,7 @@ def get_soup_for_bible_ref(reference_url, headers=None, pre_parse_regex=None, pr return None try: page_source = get_web_page(reference_url, headers, update_openlp=True) - except Exception as e: + except Exception: log.exception('Unable to download Bible %s, unknown exception occurred', reference_url) page_source = None if not page_source: diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 768665be3..bc4082d78 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -40,7 +40,7 @@ from .importers.zefania import ZefaniaBible try: from .importers.sword import SwordBible -except: +except ImportError: pass log = logging.getLogger(__name__) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 9f229dd7f..3babf5116 100755 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -38,9 +38,9 @@ from openlp.core.ui.icons import UiIcons from openlp.core.widgets.edits import SearchEdit from openlp.plugins.bibles.forms.bibleimportform import BibleImportForm from openlp.plugins.bibles.forms.editbibleform import EditBibleForm -from openlp.plugins.bibles.lib import DisplayStyle, LayoutStyle, VerseReferenceList, get_reference_match, \ +from openlp.plugins.bibles.lib import DisplayStyle, LayoutStyle, get_reference_match, \ get_reference_separator - +from openlp.plugins.bibles.lib.versereferencelist import VerseReferenceList log = logging.getLogger(__name__) diff --git a/openlp/plugins/custom/customplugin.py b/openlp/plugins/custom/customplugin.py index 0fd87ac26..82535a83a 100644 --- a/openlp/plugins/custom/customplugin.py +++ b/openlp/plugins/custom/customplugin.py @@ -33,9 +33,9 @@ from openlp.core.lib.db import Manager from openlp.core.lib.plugin import Plugin, StringContent from openlp.core.ui.icons import UiIcons from openlp.plugins.custom.endpoint import api_custom_endpoint, custom_endpoint -from openlp.plugins.custom.lib import CustomMediaItem, CustomTab from openlp.plugins.custom.lib.db import CustomSlide, init_schema -from openlp.plugins.custom.lib.mediaitem import CustomSearch +from openlp.plugins.custom.lib.mediaitem import CustomMediaItem, CustomSearch +from openlp.plugins.custom.lib.customtab import CustomTab log = logging.getLogger(__name__) diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index 8209660cc..0be2714b1 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -27,13 +27,11 @@ from PyQt5 import QtCore, QtWidgets from openlp.core.common.i18n import translate from openlp.core.common.registry import Registry from openlp.core.lib.ui import critical_error_message_box, find_and_set_in_combo_box -from openlp.plugins.custom.lib import CustomXMLBuilder, CustomXMLParser +from openlp.plugins.custom.forms.editcustomdialog import Ui_CustomEditDialog +from openlp.plugins.custom.forms.editcustomslideform import EditCustomSlideForm +from openlp.plugins.custom.lib.customxmlhandler import CustomXMLBuilder, CustomXMLParser from openlp.plugins.custom.lib.db import CustomSlide -from .editcustomdialog import Ui_CustomEditDialog -from .editcustomslideform import EditCustomSlideForm - - log = logging.getLogger(__name__) diff --git a/openlp/plugins/custom/lib/__init__.py b/openlp/plugins/custom/lib/__init__.py index da3fe3e02..711ded4ae 100644 --- a/openlp/plugins/custom/lib/__init__.py +++ b/openlp/plugins/custom/lib/__init__.py @@ -19,7 +19,3 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### - -from .customtab import CustomTab -from .customxmlhandler import CustomXMLBuilder, CustomXMLParser -from .mediaitem import CustomMediaItem diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index bb3abea1d..f3cd1b5bb 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -35,7 +35,7 @@ from openlp.core.lib.serviceitem import ItemCapabilities from openlp.core.lib.ui import create_widget_action from openlp.core.ui.icons import UiIcons from openlp.plugins.custom.forms.editcustomform import EditCustomForm -from openlp.plugins.custom.lib import CustomXMLBuilder, CustomXMLParser +from openlp.plugins.custom.lib.customxmlhandler import CustomXMLBuilder, CustomXMLParser from openlp.plugins.custom.lib.db import CustomSlide diff --git a/openlp/plugins/images/forms/__init__.py b/openlp/plugins/images/forms/__init__.py index afff288ea..cc6832d38 100644 --- a/openlp/plugins/images/forms/__init__.py +++ b/openlp/plugins/images/forms/__init__.py @@ -40,6 +40,3 @@ mentioned above, like so:: This allows OpenLP to use ``self.object`` for all the GUI elements while keeping them separate from the functionality, so that it is easier to recreate the GUI from the .ui files later if necessary. """ - -from .addgroupform import AddGroupForm -from .choosegroupform import ChooseGroupForm diff --git a/openlp/plugins/images/imageplugin.py b/openlp/plugins/images/imageplugin.py index 00a0ba98f..a181f73d1 100644 --- a/openlp/plugins/images/imageplugin.py +++ b/openlp/plugins/images/imageplugin.py @@ -32,7 +32,9 @@ from openlp.core.lib.db import Manager from openlp.core.lib.plugin import Plugin, StringContent from openlp.core.ui.icons import UiIcons from openlp.plugins.images.endpoint import api_images_endpoint, images_endpoint -from openlp.plugins.images.lib import ImageMediaItem, ImageTab, upgrade +from openlp.plugins.images.lib import upgrade +from openlp.plugins.images.lib.mediaitem import ImageMediaItem +from openlp.plugins.images.lib.imagetab import ImageTab from openlp.plugins.images.lib.db import init_schema diff --git a/openlp/plugins/images/lib/__init__.py b/openlp/plugins/images/lib/__init__.py index 668d437ce..711ded4ae 100644 --- a/openlp/plugins/images/lib/__init__.py +++ b/openlp/plugins/images/lib/__init__.py @@ -19,6 +19,3 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### - -from .imagetab import ImageTab -from .mediaitem import ImageMediaItem diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 0d8472a76..a1b27a7f5 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -37,7 +37,8 @@ from openlp.core.lib.serviceitem import ItemCapabilities from openlp.core.lib.ui import create_widget_action, critical_error_message_box from openlp.core.ui.icons import UiIcons from openlp.core.widgets.views import TreeWidgetWithDnD -from openlp.plugins.images.forms import AddGroupForm, ChooseGroupForm +from openlp.plugins.images.forms.addgroupform import AddGroupForm +from openlp.plugins.images.forms.choosegroupform import ChooseGroupForm from openlp.plugins.images.lib.db import ImageFilenames, ImageGroups diff --git a/openlp/plugins/media/lib/__init__.py b/openlp/plugins/media/lib/__init__.py index c6c0f31ae..711ded4ae 100644 --- a/openlp/plugins/media/lib/__init__.py +++ b/openlp/plugins/media/lib/__init__.py @@ -19,8 +19,3 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### - -from .mediaitem import MediaMediaItem -from .mediatab import MediaTab - -__all__ = ['MediaMediaItem'] diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index 70e68dffd..3cb85b194 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -36,7 +36,8 @@ from openlp.core.lib import build_icon from openlp.core.lib.plugin import Plugin, StringContent from openlp.core.ui.icons import UiIcons from openlp.plugins.media.endpoint import api_media_endpoint, media_endpoint -from openlp.plugins.media.lib import MediaMediaItem, MediaTab +from openlp.plugins.media.lib.mediaitem import MediaMediaItem +from openlp.plugins.media.lib.mediatab import MediaTab log = logging.getLogger(__name__) diff --git a/openlp/plugins/presentations/lib/__init__.py b/openlp/plugins/presentations/lib/__init__.py index 8cc7c1942..711ded4ae 100644 --- a/openlp/plugins/presentations/lib/__init__.py +++ b/openlp/plugins/presentations/lib/__init__.py @@ -19,8 +19,3 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### - -from .presentationcontroller import PresentationController -from .messagelistener import MessageListener -from .mediaitem import PresentationMediaItem -from .presentationtab import PresentationTab diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 2d6d01017..38642c132 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -122,7 +122,7 @@ class ImpressController(PresentationController): while uno_instance is None and loop < 3: try: uno_instance = get_uno_instance(resolver) - except: + except Exception: log.warning('Unable to find running instance ') self.start_process() loop += 1 @@ -131,7 +131,7 @@ class ImpressController(PresentationController): log.debug('get UNO Desktop Openoffice - createInstanceWithContext - Desktop') desktop = self.manager.createInstanceWithContext("com.sun.star.frame.Desktop", uno_instance) return desktop - except: + except Exception: log.warning('Failed to get UNO desktop') return None @@ -173,7 +173,7 @@ class ImpressController(PresentationController): desktop = self.get_uno_desktop() else: desktop = self.get_com_desktop() - except: + except Exception: log.warning('Failed to find an OpenOffice desktop to terminate') if not desktop: return @@ -191,7 +191,7 @@ class ImpressController(PresentationController): try: desktop.terminate() log.debug('OpenOffice killed') - except: + except Exception: log.warning('Failed to terminate OpenOffice') @@ -236,7 +236,7 @@ class ImpressDocument(PresentationDocument): properties = tuple(properties) try: self.document = desktop.loadComponentFromURL(url, '_blank', 0, properties) - except: + except Exception: log.warning('Failed to load presentation {url}'.format(url=url)) return False self.presentation = self.document.getPresentation() @@ -275,7 +275,7 @@ class ImpressDocument(PresentationDocument): delete_file(path) except ErrorCodeIOException as exception: log.exception('ERROR! ErrorCodeIOException {error:d}'.format(error=exception.ErrCode)) - except: + except Exception: log.exception('{path} - Unable to store openoffice preview'.format(path=path)) def create_property(self, name, value): @@ -303,7 +303,7 @@ class ImpressDocument(PresentationDocument): self.presentation.end() self.presentation = None self.document.dispose() - except: + except Exception: log.warning("Closing presentation failed") self.document = None self.controller.remove_doc(self) @@ -320,7 +320,7 @@ class ImpressDocument(PresentationDocument): if self.document.getPresentation() is None: log.debug("getPresentation failed to find a presentation") return False - except: + except Exception: log.warning("getPresentation failed to find a presentation") return False return True diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index 0d5997ff3..fff8c6669 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -21,7 +21,7 @@ ############################################################################### import logging -from PyQt5 import QtCore, QtGui, QtWidgets +from PyQt5 import QtCore, QtWidgets from openlp.core.common.i18n import UiStrings, get_natural_key, translate from openlp.core.common.path import path_to_str, str_to_path @@ -32,7 +32,7 @@ from openlp.core.lib.mediamanageritem import MediaManagerItem from openlp.core.lib.serviceitem import ItemCapabilities from openlp.core.lib.ui import create_horizontal_adjusting_combo_box, critical_error_message_box from openlp.core.ui.icons import UiIcons -from openlp.plugins.presentations.lib import MessageListener +from openlp.plugins.presentations.lib.messagelistener import MessageListener from openlp.plugins.presentations.lib.pdfcontroller import PDF_CONTROLLER_FILETYPES diff --git a/openlp/plugins/presentations/lib/pdfcontroller.py b/openlp/plugins/presentations/lib/pdfcontroller.py index 552e57575..0ec5b28b5 100644 --- a/openlp/plugins/presentations/lib/pdfcontroller.py +++ b/openlp/plugins/presentations/lib/pdfcontroller.py @@ -280,7 +280,7 @@ class PdfDocument(PresentationDocument): for image_path in created_files: if image_path.is_file(): self.image_files.append(image_path) - except Exception as e: + except Exception: log.exception(runlog) return False self.num_pages = len(self.image_files) diff --git a/openlp/plugins/presentations/lib/presentationcontroller.py b/openlp/plugins/presentations/lib/presentationcontroller.py index 5933b053f..e91b1589b 100644 --- a/openlp/plugins/presentations/lib/presentationcontroller.py +++ b/openlp/plugins/presentations/lib/presentationcontroller.py @@ -327,14 +327,14 @@ class PresentationDocument(object): titles_path = self.get_thumbnail_folder() / 'titles.txt' try: titles = titles_path.read_text().splitlines() - except: + except Exception: log.exception('Failed to open/read existing titles file') titles = [] for slide_no, title in enumerate(titles, 1): notes_path = self.get_thumbnail_folder() / 'slideNotes{number:d}.txt'.format(number=slide_no) try: note = notes_path.read_text() - except: + except Exception: log.exception('Failed to open/read notes file') note = '' notes.append(note) diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index 0fb347687..15a97913b 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -36,7 +36,9 @@ from openlp.core.lib import build_icon from openlp.core.lib.plugin import Plugin, StringContent from openlp.core.ui.icons import UiIcons from openlp.plugins.presentations.endpoint import api_presentations_endpoint, presentations_endpoint -from openlp.plugins.presentations.lib import PresentationController, PresentationMediaItem, PresentationTab +from openlp.plugins.presentations.lib.presentationcontroller import PresentationController +from openlp.plugins.presentations.lib.mediaitem import PresentationMediaItem +from openlp.plugins.presentations.lib.presentationtab import PresentationTab log = logging.getLogger(__name__) diff --git a/openlp/plugins/songs/forms/__init__.py b/openlp/plugins/songs/forms/__init__.py index c5b10afa3..113c3ca9d 100644 --- a/openlp/plugins/songs/forms/__init__.py +++ b/openlp/plugins/songs/forms/__init__.py @@ -45,4 +45,3 @@ This allows OpenLP to use ``self.object`` for all the GUI elements while keeping them separate from the functionality, so that it is easier to recreate the GUI from the .ui files later if necessary. """ -from .editsongform import EditSongForm diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index fe8815e96..87f2dfaa4 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -320,7 +320,7 @@ class EditSongForm(QtWidgets.QDialog, Ui_EditSongDialog, RegistryProperties): for verse in multiple: self.song.verse_order = re.sub(r'([' + verse.upper() + verse.lower() + r'])(\W|$)', r'\g<1>1\2', self.song.verse_order) - except: + except Exception: log.exception('Problem processing song Lyrics \n{xml}'.format(xml=sxml.dump_xml())) raise @@ -1088,7 +1088,7 @@ class EditSongForm(QtWidgets.QDialog, Ui_EditSongDialog, RegistryProperties): if audio_path not in file_paths: try: audio_path.unlink() - except: + except Exception: log.exception('Could not remove file: {audio}'.format(audio=audio_path)) if not file_paths: try: diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index d128a077a..dc3227f66 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -32,8 +32,7 @@ from openlp.core.common import CONTROL_CHARS from openlp.core.common.applocation import AppLocation from openlp.core.common.i18n import translate from openlp.core.common.settings import Settings -from openlp.core.display.render import remove_tags -from openlp.plugins.songs.lib.db import Author, MediaFile, Song, Topic +from openlp.plugins.songs.lib.db import Author, MediaFile, Song from openlp.plugins.songs.lib.ui import SongStrings log = logging.getLogger(__name__) diff --git a/openlp/plugins/songs/lib/importers/cclifile.py b/openlp/plugins/songs/lib/importers/cclifile.py index 5c390d6ac..82bfad989 100644 --- a/openlp/plugins/songs/lib/importers/cclifile.py +++ b/openlp/plugins/songs/lib/importers/cclifile.py @@ -291,10 +291,8 @@ class CCLIFileImport(SongImport): # verse type, so set flag verse_type = VerseType.tags[VerseType.Other] check_first_verse_line = True - verse_number = verse_desc_parts[1] else: verse_type = VerseType.tags[VerseType.Other] - verse_number = 1 verse_start = True else: # check first line for verse type diff --git a/openlp/plugins/songs/lib/importers/easyslides.py b/openlp/plugins/songs/lib/importers/easyslides.py index 169cd32f7..6f6dcf55b 100644 --- a/openlp/plugins/songs/lib/importers/easyslides.py +++ b/openlp/plugins/songs/lib/importers/easyslides.py @@ -108,7 +108,7 @@ class EasySlidesImport(SongImport): def _add_authors(self, writer): try: self.parse_author(str(writer)) - except UnicodeDecodeError as e: + except UnicodeDecodeError: log.exception('Unicode decode error while decoding Writer') self._success = False diff --git a/openlp/plugins/songs/lib/importers/openoffice.py b/openlp/plugins/songs/lib/importers/openoffice.py index ef6a39f10..1ced5c6c7 100644 --- a/openlp/plugins/songs/lib/importers/openoffice.py +++ b/openlp/plugins/songs/lib/importers/openoffice.py @@ -136,7 +136,7 @@ class OpenOfficeImport(SongImport): process = QtCore.QProcess() process.startDetached(cmd) self.process_started = True - except: + except Exception: log.exception("start_ooo_process failed") def open_ooo_file(self, file_path): @@ -178,7 +178,7 @@ class OpenOfficeImport(SongImport): """ try: self.document.close(True) - except: + except Exception: log.exception('Exception in close_ooo_file - trying to ignore it.') self.document = None @@ -189,7 +189,7 @@ class OpenOfficeImport(SongImport): if self.process_started: try: self.desktop.terminate() - except: + except Exception: log.exception('Exception in close_ooo - trying to ignore it.') def process_presentation(self): diff --git a/openlp/plugins/songs/lib/importers/songshowplus.py b/openlp/plugins/songs/lib/importers/songshowplus.py index d1f04411d..e3c70f212 100644 --- a/openlp/plugins/songs/lib/importers/songshowplus.py +++ b/openlp/plugins/songs/lib/importers/songshowplus.py @@ -224,5 +224,5 @@ class SongShowPlusImport(SongImport): try: # Don't question this, it works... return data.decode('utf-8').encode('cp1251').decode('cp1251') - except: + except Exception: return data.decode(retrieve_windows_encoding()) diff --git a/openlp/plugins/songs/lib/importers/sundayplus.py b/openlp/plugins/songs/lib/importers/sundayplus.py index 8cdcf6919..b91f48024 100644 --- a/openlp/plugins/songs/lib/importers/sundayplus.py +++ b/openlp/plugins/songs/lib/importers/sundayplus.py @@ -194,7 +194,7 @@ class SundayPlusImport(SongImport): while True: try: return blob.decode(self.encoding) - except Exception as e: + except Exception: self.encoding = retrieve_windows_encoding() def unescape(self, text): diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 4ec765eb5..ed6280262 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -325,12 +325,12 @@ class SongMediaItem(MediaManagerItem): :param search_results: A tuple containing (songbook entry, book name, song title, song id) :return: None """ - def get_songbook_key(text_array): + def get_songbook_key(text): """ Get the key to sort by - :param text_array: the result text to be processed. + :param text: the text tuple to be processed. """ - return get_natural_key(text_array[1]), get_natural_key(text_array[0]), get_natural_key(text_array[2]) + return get_natural_key('{0} {1} {2}'.format(text[1], text[0], text[2])) log.debug('display results Book') self.list_view.clear() diff --git a/openlp/plugins/songs/lib/songselect.py b/openlp/plugins/songs/lib/songselect.py index 7df22e465..9d753c514 100644 --- a/openlp/plugins/songs/lib/songselect.py +++ b/openlp/plugins/songs/lib/songselect.py @@ -34,7 +34,7 @@ from urllib.request import HTTPCookieProcessor, URLError, build_opener from bs4 import BeautifulSoup, NavigableString from openlp.plugins.songs.lib import VerseType, clean_song -from openlp.plugins.songs.lib.db import Author, Song, Topic +from openlp.plugins.songs.lib.db import Song, Author, Topic from openlp.plugins.songs.lib.openlyricsxml import SongXML diff --git a/openlp/plugins/songusage/forms/__init__.py b/openlp/plugins/songusage/forms/__init__.py index 1ab5ed70c..711ded4ae 100644 --- a/openlp/plugins/songusage/forms/__init__.py +++ b/openlp/plugins/songusage/forms/__init__.py @@ -19,6 +19,3 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### - -from .songusagedeleteform import SongUsageDeleteForm -from .songusagedetailform import SongUsageDetailForm diff --git a/openlp/plugins/songusage/songusageplugin.py b/openlp/plugins/songusage/songusageplugin.py index dec1988c4..9c408fd93 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -33,7 +33,8 @@ from openlp.core.lib.db import Manager from openlp.core.lib.plugin import Plugin, StringContent from openlp.core.lib.ui import create_action from openlp.core.ui.icons import UiIcons -from openlp.plugins.songusage.forms import SongUsageDeleteForm, SongUsageDetailForm +from openlp.plugins.songusage.forms.songusagedetailform import SongUsageDetailForm +from openlp.plugins.songusage.forms.songusagedeleteform import SongUsageDeleteForm from openlp.plugins.songusage.lib import upgrade from openlp.plugins.songusage.lib.db import SongUsageItem, init_schema diff --git a/run_openlp.py b/run_openlp.py index 2c78aa6fe..122aa5479 100755 --- a/run_openlp.py +++ b/run_openlp.py @@ -48,7 +48,6 @@ def start(): """ Instantiate and run the application. """ - faulthandler.enable() set_up_fault_handling() # Add support for using multiprocessing from frozen Windows executable (built using PyInstaller), # see https://docs.python.org/3/library/multiprocessing.html#multiprocessing.freeze_support diff --git a/scripts/appveyor.yml b/scripts/appveyor.yml index bc85834f6..43f14e69d 100644 --- a/scripts/appveyor.yml +++ b/scripts/appveyor.yml @@ -11,17 +11,15 @@ environment: install: # Install dependencies from pypi - - "%PYTHON%\\python.exe -m pip install sqlalchemy alembic appdirs chardet beautifulsoup4 lxml Mako mysql-connector-python nose mock pyodbc psycopg2 pypiwin32 websockets asyncio waitress six webob requests QtAwesome PyQt5" - # Download and install pyicu (originally from http://www.lfd.uci.edu/~gohlke/pythonlibs/) - - "%PYTHON%\\python.exe -m pip install https://get.openlp.org/win-sdk/PyICU-2.1-cp37-cp37m-win_amd64.whl" + - "%PYTHON%\\python.exe -m pip install sqlalchemy alembic appdirs chardet beautifulsoup4 lxml Mako mysql-connector-python nose mock pyodbc psycopg2 pypiwin32 websockets asyncio waitress six webob requests QtAwesome PyQt5 pymediainfo" # Download and unpack mupdf - - appveyor DownloadFile http://mupdf.com/downloads/archive/mupdf-1.9a-windows.zip - - 7z x mupdf-1.9a-windows.zip - - cp mupdf-1.9a-windows/mupdf.exe openlp-branch/mupdf.exe + - appveyor DownloadFile https://mupdf.com/downloads/archive/mupdf-1.14.0-windows.zip + - 7z x mupdf-1.14.0-windows.zip + - cp mupdf-1.14.0-windows/mupdf.exe openlp-branch/mupdf.exe # Download and unpack mediainfo - - appveyor DownloadFile https://mediaarea.net/download/binary/mediainfo/0.7.90/MediaInfo_CLI_0.7.90_Windows_i386.zip + - appveyor DownloadFile https://mediaarea.net/download/binary/mediainfo/18.08.1/MediaInfo_CLI_18.08.1_Windows_i386.zip - mkdir MediaInfo - - 7z x -oMediaInfo MediaInfo_CLI_0.7.90_Windows_i386.zip + - 7z x -oMediaInfo MediaInfo_CLI_18.08.1_Windows_i386.zip - cp MediaInfo\\MediaInfo.exe openlp-branch\\MediaInfo.exe build: off diff --git a/scripts/check_dependencies.py b/scripts/check_dependencies.py index 1a3ce8e1a..2bb2ff2a1 100755 --- a/scripts/check_dependencies.py +++ b/scripts/check_dependencies.py @@ -40,8 +40,8 @@ IS_MAC = sys.platform.startswith('dar') VERS = { 'Python': '3.6', - 'PyQt5': '5.0', - 'Qt5': '5.0', + 'PyQt5': '5.5', + 'Qt5': '5.5', 'pymediainfo': '2.2', 'sqlalchemy': '0.5', 'enchant': '1.6' @@ -52,7 +52,6 @@ WIN32_MODULES = [ 'win32com', 'win32ui', 'pywintypes', - 'icu', ] LINUX_MODULES = [ diff --git a/scripts/translation_utils.py b/scripts/translation_utils.py index 3cc698cc1..83285969f 100755 --- a/scripts/translation_utils.py +++ b/scripts/translation_utils.py @@ -60,7 +60,6 @@ from getpass import getpass from lxml import etree, objectify from PyQt5 import QtCore - SERVER_URL = 'http://www.transifex.com/api/2/project/openlp/resource/openlp-26x/' IGNORED_PATHS = ['scripts'] IGNORED_FILES = ['setup.py'] diff --git a/setup.cfg b/setup.cfg index 419a7d946..71cd36460 100644 --- a/setup.cfg +++ b/setup.cfg @@ -9,16 +9,13 @@ ignore = E402,E722,W503,W504 [flake8] exclude=resources.py,vlc.py -max-line-length = 120 -ignore = E402,E722,W503,W504 +ignore = E402,W503,W504,D [pycodestyle] exclude = resources.py,vlc.py max-line-length = 120 # Ignoring: # E402... -# E722 do not use bare 'except' # W503 line break before binary operator # W504 line break after binary operator -ignore = E402,E722,W503,W504 - +ignore = E402,W503,W504 diff --git a/setup.py b/setup.py index 9ab4ecd0d..0fc6269c4 100755 --- a/setup.py +++ b/setup.py @@ -119,7 +119,8 @@ requires = [ 'chardet', 'lxml', 'Mako', - 'PyQt5', + 'pymediainfo >= 2.2', + 'PyQt5 >= 5.5', 'QtAwesome', 'requests', 'SQLAlchemy >= 0.5', @@ -128,10 +129,7 @@ requires = [ 'websockets' ] if sys.platform.startswith('win'): - requires.extend([ - 'PyICU', - 'pywin32' - ]) + requires.append('pywin32') elif sys.platform.startswith('darwin'): requires.extend([ 'pyobjc', @@ -188,7 +186,7 @@ using a computer and a data projector.""", author_email='raoulsnyman@openlp.org', url='https://openlp.org/', license='GNU General Public License', - packages=find_packages(exclude=['ez_setup', 'tests']), + packages=find_packages(exclude=['ez_setup', 'tests*']), py_modules=['run_openlp'], include_package_data=True, zip_safe=False, @@ -204,7 +202,7 @@ using a computer and a data projector.""", 'jenkins': ['python-jenkins'], 'launchpad': ['launchpadlib'] }, - tests_require=['nose2', 'PyICU', 'pylint', 'pyodbc', 'pysword'], + tests_require=['nose2', 'pylint', 'pyodbc', 'pysword'], test_suite='nose2.collector.collector', entry_points={'gui_scripts': ['openlp = run_openlp:start']} ) diff --git a/tests/functional/openlp_core/api/http/test_wsgiapp.py b/tests/functional/openlp_core/api/http/test_wsgiapp.py index fd84e0a6d..32a304b41 100644 --- a/tests/functional/openlp_core/api/http/test_wsgiapp.py +++ b/tests/functional/openlp_core/api/http/test_wsgiapp.py @@ -26,8 +26,9 @@ import os from unittest import TestCase from unittest.mock import MagicMock -from openlp.core.api.http import NotFound, application, register_endpoint +from openlp.core.api.http import register_endpoint, application from openlp.core.api.http.endpoint import Endpoint +from openlp.core.api.http.errors import NotFound ROOT_DIR = os.path.dirname(os.path.realpath(__file__)) @@ -69,7 +70,9 @@ class TestRouting(TestCase): rqst.method = 'GET' application.dispatch(rqst) # THEN: the not found id called - assert 1 == application.route_map['^\\/test\\/image$']['GET'].call_count, \ + route_key = next(iter(application.route_map)) + assert '/image' in route_key + assert 1 == application.route_map[route_key]['GET'].call_count, \ 'main_index function should have been called' diff --git a/tests/functional/openlp_core/api/test_tab.py b/tests/functional/openlp_core/api/test_tab.py index 983046877..fa45b5459 100644 --- a/tests/functional/openlp_core/api/test_tab.py +++ b/tests/functional/openlp_core/api/test_tab.py @@ -24,7 +24,6 @@ This module contains tests for the lib submodule of the Remotes plugin. """ import re from unittest import TestCase -from unittest.mock import patch from PyQt5 import QtWidgets diff --git a/tests/functional/openlp_core/common/test_db.py b/tests/functional/openlp_core/common/test_db.py index 4f9b228ba..21912364e 100644 --- a/tests/functional/openlp_core/common/test_db.py +++ b/tests/functional/openlp_core/common/test_db.py @@ -63,7 +63,7 @@ class TestUtilsDBFunctions(TestCase): if os.path.exists(self.tmp_folder): shutil.rmtree(self.tmp_folder) break - except: + except Exception: time.sleep(1) retries += 1 diff --git a/tests/functional/openlp_core/common/test_i18n.py b/tests/functional/openlp_core/common/test_i18n.py index deb8c7bba..2edc44b2e 100644 --- a/tests/functional/openlp_core/common/test_i18n.py +++ b/tests/functional/openlp_core/common/test_i18n.py @@ -22,12 +22,10 @@ """ Package to test the openlp.core.lib.languages package. """ -from unittest import skipIf from unittest.mock import MagicMock, patch -from openlp.core.common import is_macosx -from openlp.core.common.i18n import LANGUAGES, Language, LanguageManager, UiStrings, get_language, get_locale_key, \ - get_natural_key, translate +from openlp.core.common.i18n import LANGUAGES, Language, UiStrings, get_language, get_locale_key, get_natural_key, \ + translate, LanguageManager from openlp.core.common.settings import Settings @@ -113,7 +111,6 @@ def test_get_language_invalid_with_none(): assert language is None -@skipIf(is_macosx(), 'This test doesn\'t work on macOS currently') def test_get_locale_key(): """ Test the get_locale_key(string) function diff --git a/tests/functional/openlp_core/common/test_path.py b/tests/functional/openlp_core/common/test_path.py index b65eaa2cc..2a4917395 100644 --- a/tests/functional/openlp_core/common/test_path.py +++ b/tests/functional/openlp_core/common/test_path.py @@ -397,7 +397,7 @@ class TestPath(TestCase): try: create_paths(mocked_path) assert False, 'create_paths should have thrown an exception' - except: + except Exception: # THEN: `create_paths` raises an exception pass diff --git a/tests/functional/openlp_core/lib/test_lib.py b/tests/functional/openlp_core/lib/test_lib.py index 46bf658a2..66d5ba4c2 100644 --- a/tests/functional/openlp_core/lib/test_lib.py +++ b/tests/functional/openlp_core/lib/test_lib.py @@ -279,7 +279,7 @@ class TestLib(TestCase): # last test. try: thumb_path.unlink() - except: + except Exception: pass # Only continue when the thumb does not exist. @@ -297,7 +297,7 @@ class TestLib(TestCase): # Remove the thumb so that the test actually tests if the thumb will be created. try: thumb_path.unlink() - except: + except Exception: pass def test_create_thumb_no_size(self): @@ -313,7 +313,7 @@ class TestLib(TestCase): # last test. try: thumb_path.unlink() - except: + except Exception: pass # Only continue when the thumb does not exist. @@ -331,7 +331,7 @@ class TestLib(TestCase): # Remove the thumb so that the test actually tests if the thumb will be created. try: thumb_path.unlink() - except: + except Exception: pass def test_create_thumb_invalid_size(self): @@ -348,7 +348,7 @@ class TestLib(TestCase): # last test. try: thumb_path.unlink() - except: + except Exception: pass # Only continue when the thumb does not exist. @@ -366,7 +366,7 @@ class TestLib(TestCase): # Remove the thumb so that the test actually tests if the thumb will be created. try: thumb_path.unlink() - except: + except Exception: pass def test_create_thumb_width_only(self): @@ -383,7 +383,7 @@ class TestLib(TestCase): # last test. try: thumb_path.unlink() - except: + except Exception: pass # Only continue when the thumb does not exist. @@ -401,7 +401,7 @@ class TestLib(TestCase): # Remove the thumb so that the test actually tests if the thumb will be created. try: thumb_path.unlink() - except: + except Exception: pass def test_create_thumb_height_only(self): @@ -418,7 +418,7 @@ class TestLib(TestCase): # last test. try: thumb_path.unlink() - except: + except Exception: pass # Only continue when the thumb does not exist. @@ -436,7 +436,7 @@ class TestLib(TestCase): # Remove the thumb so that the test actually tests if the thumb will be created. try: thumb_path.unlink() - except: + except Exception: pass def test_create_thumb_empty_img(self): @@ -454,7 +454,7 @@ class TestLib(TestCase): # last test. try: thumb_path.unlink() - except: + except Exception: pass # Only continue when the thumb does not exist. @@ -484,7 +484,7 @@ class TestLib(TestCase): # Remove the thumb so that the test actually tests if the thumb will be created. try: thumb_path.unlink() - except: + except Exception: pass @patch('openlp.core.lib.QtWidgets', MagicMock()) diff --git a/tests/functional/openlp_core/ui/media/test_vlcplayer.py b/tests/functional/openlp_core/ui/media/test_vlcplayer.py index 5cbcf4392..14bd0064f 100644 --- a/tests/functional/openlp_core/ui/media/test_vlcplayer.py +++ b/tests/functional/openlp_core/ui/media/test_vlcplayer.py @@ -412,7 +412,7 @@ class TestVLCPlayer(TestCase, TestMixin): # WHEN: An audio CD is loaded into VLC with patch.object(vlc_player, 'volume') as mocked_volume, \ - patch.object(vlc_player, 'media_state_wait') as mocked_media_state_wait: + patch.object(vlc_player, 'media_state_wait'): result = vlc_player.load(mocked_display) # THEN: The video should be loaded @@ -457,7 +457,7 @@ class TestVLCPlayer(TestCase, TestMixin): # WHEN: An audio CD is loaded into VLC with patch.object(vlc_player, 'volume') as mocked_volume, \ - patch.object(vlc_player, 'media_state_wait') as mocked_media_state_wait: + patch.object(vlc_player, 'media_state_wait'): result = vlc_player.load(mocked_display) # THEN: The video should be loaded @@ -501,8 +501,7 @@ class TestVLCPlayer(TestCase, TestMixin): vlc_player = VlcPlayer(None) # WHEN: An audio CD is loaded into VLC - with patch.object(vlc_player, 'volume') as mocked_volume, \ - patch.object(vlc_player, 'media_state_wait') as mocked_media_state_wait: + with patch.object(vlc_player, 'volume'), patch.object(vlc_player, 'media_state_wait'): result = vlc_player.load(mocked_display) # THEN: The video should be loaded @@ -657,7 +656,7 @@ class TestVLCPlayer(TestCase, TestMixin): # WHEN: play() is called with patch.object(vlc_player, 'media_state_wait') as mocked_media_state_wait, \ - patch.object(vlc_player, 'volume') as mocked_volume: + patch.object(vlc_player, 'volume'): mocked_media_state_wait.return_value = False result = vlc_player.play(mocked_display) @@ -690,7 +689,7 @@ class TestVLCPlayer(TestCase, TestMixin): vlc_player.set_state(MediaState.Paused, mocked_display) # WHEN: play() is called - with patch.object(vlc_player, 'media_state_wait', return_value=True) as mocked_media_state_wait, \ + with patch.object(vlc_player, 'media_state_wait', return_value=True), \ patch.object(vlc_player, 'volume') as mocked_volume, \ patch.object(vlc_player, 'get_live_state', return_value=MediaState.Loaded): result = vlc_player.play(mocked_display) diff --git a/tests/functional/openlp_core/ui/test_exceptionform.py b/tests/functional/openlp_core/ui/test_exceptionform.py index 13f0042e5..41bd230ad 100644 --- a/tests/functional/openlp_core/ui/test_exceptionform.py +++ b/tests/functional/openlp_core/ui/test_exceptionform.py @@ -34,42 +34,30 @@ from openlp.core.ui import exceptionform from tests.helpers.testmixin import TestMixin -exceptionform.WEBKIT_VERSION = 'Webkit Test' exceptionform.MIGRATE_VERSION = 'Migrate Test' exceptionform.CHARDET_VERSION = 'CHARDET Test' exceptionform.ENCHANT_VERSION = 'Enchant Test' exceptionform.MAKO_VERSION = 'Mako Test' -exceptionform.ICU_VERSION = 'ICU Test' exceptionform.VLC_VERSION = 'VLC Test' MAIL_ITEM_TEXT = ('**OpenLP Bug Report**\nVersion: Trunk Test\n\n--- Details of the Exception. ---\n\n' 'Description Test\n\n --- Exception Traceback ---\nopenlp: Traceback Test\n' '--- System information ---\nPlatform: Nose Test\n\n--- Library Versions ---\n' - 'Python: Python Test\nQt5: Qt5 Test\nPyQt5: PyQt5 Test\n' - 'SQLAlchemy: SQLAlchemy Test\nAlembic: Alembic Test\nBeautifulSoup: BeautifulSoup Test\n' - 'lxml: ETree Test\nChardet: Chardet Test\nPyEnchant: PyEnchant Test\nMako: Mako Test\n' - 'pyICU: pyICU Test\nVLC: VLC Test\nPyUNO: UNO Bridge Test\n') -LIBRARY_VERSIONS = OrderedDict([ - ('Python', 'Python Test'), - ('Qt5', 'Qt5 Test'), - ('PyQt5', 'PyQt5 Test'), - ('SQLAlchemy', 'SQLAlchemy Test'), - ('Alembic', 'Alembic Test'), - ('BeautifulSoup', 'BeautifulSoup Test'), - ('lxml', 'ETree Test'), - ('Chardet', 'Chardet Test'), - ('PyEnchant', 'PyEnchant Test'), - ('Mako', 'Mako Test'), - ('pyICU', 'pyICU Test'), - ('VLC', 'VLC Test') -]) + 'Python: Python Test\nQt5: Qt5 test\nPyQt5: PyQt5 Test\n' + 'SQLAlchemy: SqlAlchemy Test\nSQLAlchemy Migrate: Migrate Test\nBeautifulSoup: BeautifulSoup Test\n' + 'lxml: ETree Test\nChardet: CHARDET Test\nPyEnchant: Enchant Test\nMako: Mako Test\n' + 'pyUNO bridge: UNO Bridge Test\nVLC: VLC Test\n\n') -@patch('openlp.core.ui.exceptionform.QtGui.QDesktopServices.openUrl') -@patch('openlp.core.ui.exceptionform.get_version') -@patch('openlp.core.ui.exceptionform.get_library_versions') -@patch('openlp.core.ui.exceptionform.is_linux') -@patch('openlp.core.ui.exceptionform.platform.platform') +@patch("openlp.core.ui.exceptionform.Qt.qVersion") +@patch("openlp.core.ui.exceptionform.QtGui.QDesktopServices.openUrl") +@patch("openlp.core.ui.exceptionform.get_version") +@patch("openlp.core.ui.exceptionform.sqlalchemy") +@patch("openlp.core.ui.exceptionform.bs4") +@patch("openlp.core.ui.exceptionform.etree") +@patch("openlp.core.ui.exceptionform.is_linux") +@patch("openlp.core.ui.exceptionform.platform.platform") +@patch("openlp.core.ui.exceptionform.platform.python_version") class TestExceptionForm(TestMixin, TestCase): """ Test functionality of exception form functions diff --git a/tests/functional/openlp_core/ui/test_icons.py b/tests/functional/openlp_core/ui/test_icons.py index 19e99f31e..a474622f1 100644 --- a/tests/functional/openlp_core/ui/test_icons.py +++ b/tests/functional/openlp_core/ui/test_icons.py @@ -22,8 +22,8 @@ """ Package to test the openlp.core.ui.icons package. """ -from unittest import TestCase, skipUnless -from unittest.mock import MagicMock, patch +from unittest import TestCase +from unittest.mock import patch from PyQt5 import QtGui diff --git a/tests/functional/openlp_core/ui/test_servicemanager.py b/tests/functional/openlp_core/ui/test_servicemanager.py index 6d1be8e3c..f7c765bbe 100644 --- a/tests/functional/openlp_core/ui/test_servicemanager.py +++ b/tests/functional/openlp_core/ui/test_servicemanager.py @@ -22,7 +22,6 @@ """ Package to test the openlp.core.ui.slidecontroller package. """ -import os from unittest import TestCase from unittest.mock import MagicMock, patch diff --git a/tests/functional/openlp_plugins/bibles/test_csvimport.py b/tests/functional/openlp_plugins/bibles/test_csvimport.py index 84df39bfb..e926bc993 100644 --- a/tests/functional/openlp_plugins/bibles/test_csvimport.py +++ b/tests/functional/openlp_plugins/bibles/test_csvimport.py @@ -25,7 +25,7 @@ This module contains tests for the CSV Bible importer. import csv from collections import namedtuple from unittest import TestCase -from unittest.mock import ANY, MagicMock, PropertyMock, call, patch +from unittest.mock import MagicMock, PropertyMock, call, patch from openlp.core.common.path import Path from openlp.core.lib.exceptions import ValidationError @@ -132,35 +132,40 @@ class TestCSVImport(TestCase): # GIVEN: A mocked csv.reader which returns an iterator with test data test_data = [['1', 'Line 1', 'Data 1'], ['2', 'Line 2', 'Data 2'], ['3', 'Line 3', 'Data 3']] TestTuple = namedtuple('TestTuple', 'line_no line_description line_data') + mocked_csv_file = MagicMock() + mocked_enter_file = MagicMock() + mocked_csv_file.open.return_value.__enter__.return_value = mocked_enter_file with patch('openlp.plugins.bibles.lib.importers.csvbible.get_file_encoding', - return_value={'encoding': 'utf-8', 'confidence': 0.99}),\ - patch('openlp.plugins.bibles.lib.importers.csvbible.Path.open', create=True) as mocked_open,\ + return_value={'encoding': 'utf-8', 'confidence': 0.99}), \ patch('openlp.plugins.bibles.lib.importers.csvbible.csv.reader', return_value=iter(test_data)) as mocked_reader: # WHEN: Calling the CSVBible parse_csv_file method with a file name and TestTuple - result = CSVBible.parse_csv_file(Path('file.csv'), TestTuple) + result = CSVBible.parse_csv_file(mocked_csv_file, TestTuple) # THEN: A list of TestTuple instances with the parsed data should be returned assert result == [TestTuple('1', 'Line 1', 'Data 1'), TestTuple('2', 'Line 2', 'Data 2'), TestTuple('3', 'Line 3', 'Data 3')] - mocked_open.assert_called_once_with('r', encoding='utf-8', newline='') - mocked_reader.assert_called_once_with(ANY, delimiter=',', quotechar='"') + mocked_csv_file.open.assert_called_once_with('r', encoding='utf-8', newline='') + mocked_reader.assert_called_once_with(mocked_enter_file, delimiter=',', quotechar='"') def test_parse_csv_file_oserror(self): """ Test the parse_csv_file() handles an OSError correctly """ # GIVEN: Mocked a mocked open object which raises an OSError + mocked_csv_file = MagicMock() + mocked_csv_file.__str__.return_value = 'file.csv' + mocked_csv_file.open.side_effect = OSError() + with patch('openlp.plugins.bibles.lib.importers.csvbible.get_file_encoding', - return_value={'encoding': 'utf-8', 'confidence': 0.99}),\ - patch('openlp.plugins.bibles.lib.importers.csvbible.Path.open', side_effect=OSError, create=True): + return_value={'encoding': 'utf-8', 'confidence': 0.99}): # WHEN: Calling CSVBible.parse_csv_file # THEN: A ValidationError should be raised with self.assertRaises(ValidationError) as context: - CSVBible.parse_csv_file(Path('file.csv'), None) + CSVBible.parse_csv_file(mocked_csv_file, None) assert context.exception.msg == 'Parsing "file.csv" failed' def test_parse_csv_file_csverror(self): @@ -168,15 +173,17 @@ class TestCSVImport(TestCase): Test the parse_csv_file() handles an csv.Error correctly """ # GIVEN: Mocked a csv.reader which raises an csv.Error + mocked_csv_file = MagicMock() + mocked_csv_file.__str__.return_value = 'file.csv' + with patch('openlp.plugins.bibles.lib.importers.csvbible.get_file_encoding', return_value={'encoding': 'utf-8', 'confidence': 0.99}),\ - patch('openlp.plugins.bibles.lib.importers.csvbible.Path.open', create=True),\ patch('openlp.plugins.bibles.lib.importers.csvbible.csv.reader', side_effect=csv.Error): # WHEN: Calling CSVBible.parse_csv_file # THEN: A ValidationError should be raised with self.assertRaises(ValidationError) as context: - CSVBible.parse_csv_file(Path('file.csv'), None) + CSVBible.parse_csv_file(mocked_csv_file, None) assert context.exception.msg == 'Parsing "file.csv" failed' def test_process_books_stopped_import(self): diff --git a/tests/functional/openlp_plugins/bibles/test_lib.py b/tests/functional/openlp_plugins/bibles/test_lib.py index 594b3e8cc..25e16b316 100644 --- a/tests/functional/openlp_plugins/bibles/test_lib.py +++ b/tests/functional/openlp_plugins/bibles/test_lib.py @@ -55,7 +55,7 @@ class TestLib(TestCase, TestMixin): # WHEN: Calling get_reference_separator for key, value in separators.items(): - _ = lib.get_reference_separator(key) + lib.get_reference_separator(key) # THEN: get_reference_separator should return the correct separator assert separators[key] == value diff --git a/tests/functional/openlp_plugins/bibles/test_mediaitem.py b/tests/functional/openlp_plugins/bibles/test_mediaitem.py index 38dc47232..e8f4997d8 100755 --- a/tests/functional/openlp_plugins/bibles/test_mediaitem.py +++ b/tests/functional/openlp_plugins/bibles/test_mediaitem.py @@ -756,7 +756,7 @@ class TestMediaItem(TestCase, TestMixin): # GIVEN: An instance of :class:`MediaManagerItem` and mocked media_item.settings and select_book_combo_box self.media_item.version_combo_box = MagicMock(**{'currentData.return_value': None}) self.media_item.select_book_combo_box = MagicMock() - with patch.object(self.media_item, 'initialise_advanced_bible') as mocked_initialise_advanced_bible: + with patch.object(self.media_item, 'initialise_advanced_bible'): # WHEN: Calling on_version_combo_box_index_changed self.media_item.on_version_combo_box_index_changed() @@ -774,7 +774,7 @@ class TestMediaItem(TestCase, TestMixin): mocked_bible_db.name = 'ABC' self.media_item.version_combo_box = MagicMock(**{'currentData.return_value': mocked_bible_db}) self.media_item.select_book_combo_box = MagicMock() - with patch.object(self.media_item, 'initialise_advanced_bible') as mocked_initialise_advanced_bible: + with patch.object(self.media_item, 'initialise_advanced_bible'): # WHEN: Calling on_version_combo_box_index_changed self.media_item.on_version_combo_box_index_changed() @@ -792,7 +792,7 @@ class TestMediaItem(TestCase, TestMixin): self.media_item.list_view = MagicMock(**{'count.return_value': 5}) self.media_item.style_combo_box = MagicMock() self.media_item.select_book_combo_box = MagicMock() - with patch.object(self.media_item, 'initialise_advanced_bible') as mocked_initialise_advanced_bible, \ + with patch.object(self.media_item, 'initialise_advanced_bible'), \ patch('openlp.plugins.bibles.lib.mediaitem.critical_error_message_box') \ as mocked_critical_error_message_box: @@ -815,7 +815,7 @@ class TestMediaItem(TestCase, TestMixin): self.media_item.list_view = MagicMock(**{'count.return_value': 5}) self.media_item.style_combo_box = MagicMock() self.media_item.select_book_combo_box = MagicMock() - with patch.object(self.media_item, 'initialise_advanced_bible') as mocked_initialise_advanced_bible, \ + with patch.object(self.media_item, 'initialise_advanced_bible'), \ patch('openlp.plugins.bibles.lib.mediaitem.critical_error_message_box', return_value=QtWidgets.QMessageBox.No) as mocked_critical_error_message_box: diff --git a/tests/functional/openlp_plugins/bibles/test_upgrade.py b/tests/functional/openlp_plugins/bibles/test_upgrade.py index 1e2520391..955f58c69 100644 --- a/tests/functional/openlp_plugins/bibles/test_upgrade.py +++ b/tests/functional/openlp_plugins/bibles/test_upgrade.py @@ -22,14 +22,12 @@ """ This module contains tests for the upgrade submodule of the Bibles plugin. """ -import os import shutil from pathlib import Path from tempfile import mkdtemp from unittest import TestCase from unittest.mock import MagicMock, call, patch -from PyQt5 import QtWidgets from sqlalchemy import create_engine from openlp.core.common.settings import ProxyMode diff --git a/tests/functional/openlp_plugins/custom/test_mediaitem.py b/tests/functional/openlp_plugins/custom/test_mediaitem.py index 7dfecf2b6..9e11a931a 100644 --- a/tests/functional/openlp_plugins/custom/test_mediaitem.py +++ b/tests/functional/openlp_plugins/custom/test_mediaitem.py @@ -30,7 +30,7 @@ from PyQt5 import QtCore from openlp.core.common.registry import Registry from openlp.core.lib.plugin import PluginStatus from openlp.core.lib.serviceitem import ServiceItem -from openlp.plugins.custom.lib import CustomMediaItem +from openlp.plugins.custom.lib.mediaitem import CustomMediaItem from tests.helpers.testmixin import TestMixin diff --git a/tests/functional/openlp_plugins/images/test_imagetab.py b/tests/functional/openlp_plugins/images/test_imagetab.py index 21a8f87df..de57f790a 100644 --- a/tests/functional/openlp_plugins/images/test_imagetab.py +++ b/tests/functional/openlp_plugins/images/test_imagetab.py @@ -29,7 +29,7 @@ from PyQt5 import QtWidgets from openlp.core.common.registry import Registry from openlp.core.common.settings import Settings -from openlp.plugins.images.lib import ImageTab +from openlp.plugins.images.lib.imagetab import ImageTab from tests.helpers.testmixin import TestMixin diff --git a/tests/functional/openlp_plugins/presentations/test_impresscontroller.py b/tests/functional/openlp_plugins/presentations/test_impresscontroller.py index 6ecdeef70..aa8b2044a 100644 --- a/tests/functional/openlp_plugins/presentations/test_impresscontroller.py +++ b/tests/functional/openlp_plugins/presentations/test_impresscontroller.py @@ -27,7 +27,6 @@ from tempfile import mkdtemp from unittest import TestCase from unittest.mock import MagicMock, patch -from openlp.core.common.path import Path from openlp.core.common.settings import Settings from openlp.plugins.presentations.lib.impresscontroller import ImpressController, ImpressDocument, TextType from openlp.plugins.presentations.presentationplugin import __default_settings__ diff --git a/tests/functional/openlp_plugins/songs/test_lib.py b/tests/functional/openlp_plugins/songs/test_lib.py index a40835cd4..dfe306552 100644 --- a/tests/functional/openlp_plugins/songs/test_lib.py +++ b/tests/functional/openlp_plugins/songs/test_lib.py @@ -313,7 +313,7 @@ class TestLib(TestCase): # WHEN: Transposing it 1 down # THEN: An exception should be raised with self.assertRaises(ValueError) as err: - new_chord = transpose_chord(chord, -1, 'english') + transpose_chord(chord, -1, 'english') assert err.exception.args[0] == '\'T\' is not in list', \ 'ValueError exception should have been thrown for invalid chord' diff --git a/tests/functional/openlp_plugins/songs/test_mediaitem.py b/tests/functional/openlp_plugins/songs/test_mediaitem.py index b8a413868..3b0bbe3be 100644 --- a/tests/functional/openlp_plugins/songs/test_mediaitem.py +++ b/tests/functional/openlp_plugins/songs/test_mediaitem.py @@ -23,7 +23,7 @@ This module contains tests for the lib submodule of the Songs plugin. """ from unittest import TestCase -from unittest.mock import MagicMock, call, patch +from unittest.mock import MagicMock, patch from PyQt5 import QtCore @@ -170,27 +170,23 @@ class TestMediaItem(TestCase, TestMixin): """ Test that songbooks are sorted naturally """ - # GIVEN: Search results grouped by book and entry, plus a mocked QtListWidgetItem - with patch('openlp.core.lib.QtWidgets.QListWidgetItem') as MockedQListWidgetItem: - mock_search_results = [('2', 'Thy Book', 'Thy Song', 50), - ('2', 'My Book', 'Your Song', 7), - ('10', 'My Book', 'Our Song', 12), - ('1', 'My Book', 'My Song', 1), - ('2', 'Thy Book', 'A Song', 8)] - mock_qlist_widget = MagicMock() - MockedQListWidgetItem.return_value = mock_qlist_widget + # GIVEN: Search results grouped by book and entry + search_results = [('2', 'Thy Book', 'Thy Song', 50), + ('2', 'My Book', 'Your Song', 7), + ('10', 'My Book', 'Our Song', 12), + ('1', 'My Book', 'My Song', 1), + ('2', 'Thy Book', 'A Song', 8)] - # WHEN: I display song search results grouped by book - self.media_item.display_results_book(mock_search_results) + # WHEN: I display song search results grouped by book + self.media_item.display_results_book(search_results) - # THEN: The songbooks are inserted in the right (natural) order, - # grouped first by book, then by number, then by song title - calls = [call('My Book #1: My Song'), call().setData(QtCore.Qt.UserRole, 1), - call('My Book #2: Your Song'), call().setData(QtCore.Qt.UserRole, 7), - call('My Book #10: Our Song'), call().setData(QtCore.Qt.UserRole, 12), - call('Thy Book #2: A Song'), call().setData(QtCore.Qt.UserRole, 8), - call('Thy Book #2: Thy Song'), call().setData(QtCore.Qt.UserRole, 50)] - MockedQListWidgetItem.assert_has_calls(calls) + # THEN: The songbooks are sorted inplace in the right (natural) order, + # grouped first by book, then by number, then by song title + assert search_results == [('1', 'My Book', 'My Song', 1), + ('2', 'My Book', 'Your Song', 7), + ('10', 'My Book', 'Our Song', 12), + ('2', 'Thy Book', 'A Song', 8), + ('2', 'Thy Book', 'Thy Song', 50)] def test_display_results_topic(self): """ diff --git a/tests/functional/openlp_plugins/songs/test_mediashout.py b/tests/functional/openlp_plugins/songs/test_mediashout.py index c9901ac82..3b03593b6 100644 --- a/tests/functional/openlp_plugins/songs/test_mediashout.py +++ b/tests/functional/openlp_plugins/songs/test_mediashout.py @@ -100,7 +100,7 @@ class TestMediaShoutImport(TestCase): mocked_pyodbc.connect.return_value = mocked_connection # WHEN: do_import is called - with patch.object(importer, 'import_wizard') as mocked_import_wizard, \ + with patch.object(importer, 'import_wizard'), \ patch.object(importer, 'process_song') as mocked_process_song: importer.do_import() @@ -134,7 +134,7 @@ class TestMediaShoutImport(TestCase): mocked_pyodbc.connect.return_value = mocked_connection # WHEN: do_import is called, but cancelled - with patch.object(importer, 'import_wizard') as mocked_import_wizard, \ + with patch.object(importer, 'import_wizard'), \ patch.object(importer, 'process_song') as mocked_process_song: importer.stop_import_flag = True importer.do_import() diff --git a/tests/interfaces/openlp_core/common/test_utils.py b/tests/interfaces/openlp_core/common/test_utils.py index e4431b7ea..b3be13a0d 100644 --- a/tests/interfaces/openlp_core/common/test_utils.py +++ b/tests/interfaces/openlp_core/common/test_utils.py @@ -25,8 +25,6 @@ Functional tests to test the AppLocation class and related methods. from unittest import TestCase from openlp.core.common import is_not_image_file -from openlp.core.common.path import Path -from tests.helpers.testmixin import TestMixin from tests.utils.constants import RESOURCE_PATH diff --git a/tests/interfaces/openlp_plugins/bibles/forms/test_bibleimportform.py b/tests/interfaces/openlp_plugins/bibles/forms/test_bibleimportform.py index 840039fbe..de7ec9712 100644 --- a/tests/interfaces/openlp_plugins/bibles/forms/test_bibleimportform.py +++ b/tests/interfaces/openlp_plugins/bibles/forms/test_bibleimportform.py @@ -46,7 +46,6 @@ class TestBibleImportForm(TestCase, TestMixin): self.setup_application() self.main_window = QtWidgets.QMainWindow() Registry().register('main_window', self.main_window) - PYSWORD_AVAILABLE = False self.mocked_manager = MagicMock() self.form = BibleImportForm(self.main_window, self.mocked_manager, MagicMock()) diff --git a/tests/interfaces/openlp_plugins/bibles/test_lib_manager.py b/tests/interfaces/openlp_plugins/bibles/test_lib_manager.py index 4252a2064..bd24f2c85 100644 --- a/tests/interfaces/openlp_plugins/bibles/test_lib_manager.py +++ b/tests/interfaces/openlp_plugins/bibles/test_lib_manager.py @@ -27,7 +27,8 @@ from unittest.mock import MagicMock, patch from openlp.core.common.registry import Registry from openlp.core.common.settings import Settings -from openlp.plugins.bibles.lib import BibleManager, LanguageSelection +from openlp.plugins.bibles.lib import LanguageSelection +from openlp.plugins.bibles.lib.manager import BibleManager from tests.helpers.testmixin import TestMixin from tests.utils.constants import TEST_RESOURCES_PATH diff --git a/tests/interfaces/openlp_plugins/bibles/test_lib_parse_reference.py b/tests/interfaces/openlp_plugins/bibles/test_lib_parse_reference.py index 5d276a1ba..aef54c38f 100644 --- a/tests/interfaces/openlp_plugins/bibles/test_lib_parse_reference.py +++ b/tests/interfaces/openlp_plugins/bibles/test_lib_parse_reference.py @@ -27,7 +27,8 @@ from unittest.mock import MagicMock, patch from openlp.core.common.registry import Registry from openlp.core.common.settings import Settings -from openlp.plugins.bibles.lib import BibleManager, LanguageSelection, parse_reference +from openlp.plugins.bibles.lib import LanguageSelection, parse_reference +from openlp.plugins.bibles.lib.manager import BibleManager from tests.helpers.testmixin import TestMixin from tests.utils.constants import TEST_RESOURCES_PATH diff --git a/tests/interfaces/openlp_plugins/custom/forms/test_customform.py b/tests/interfaces/openlp_plugins/custom/forms/test_customform.py index bbe86b0dd..680e71fe8 100644 --- a/tests/interfaces/openlp_plugins/custom/forms/test_customform.py +++ b/tests/interfaces/openlp_plugins/custom/forms/test_customform.py @@ -84,7 +84,7 @@ class TestEditCustomForm(TestCase, TestMixin): Test the on_add_button_clicked_test method / add_button button. """ # GIVEN: A mocked QDialog.exec() method - with patch('PyQt5.QtWidgets.QDialog.exec') as mocked_exec: + with patch('PyQt5.QtWidgets.QDialog.exec'): # WHEN: Add a new slide. QtTest.QTest.mouseClick(self.form.add_button, QtCore.Qt.LeftButton) diff --git a/tests/interfaces/openlp_plugins/custom/forms/test_customslideform.py b/tests/interfaces/openlp_plugins/custom/forms/test_customslideform.py index f7d5abdd7..27fc77fc6 100644 --- a/tests/interfaces/openlp_plugins/custom/forms/test_customslideform.py +++ b/tests/interfaces/openlp_plugins/custom/forms/test_customslideform.py @@ -58,7 +58,7 @@ class TestEditCustomSlideForm(TestCase, TestMixin): Test if the dialog is correctly set up. """ # GIVEN: A mocked QDialog.exec() method - with patch('PyQt5.QtWidgets.QDialog.exec') as mocked_exec: + with patch('PyQt5.QtWidgets.QDialog.exec'): # WHEN: Show the dialog. self.form.exec() @@ -70,7 +70,7 @@ class TestEditCustomSlideForm(TestCase, TestMixin): Test the set_text() method. """ # GIVEN: A mocked QDialog.exec() method - with patch('PyQt5.QtWidgets.QDialog.exec') as mocked_exec: + with patch('PyQt5.QtWidgets.QDialog.exec'): mocked_set_focus = MagicMock() self.form.slide_text_edit.setFocus = mocked_set_focus wanted_text = 'THIS TEXT SHOULD BE SHOWN.' diff --git a/tests/interfaces/openlp_plugins/media/forms/test_mediaclipselectorform.py b/tests/interfaces/openlp_plugins/media/forms/test_mediaclipselectorform.py index bcc64e558..a0a851b02 100644 --- a/tests/interfaces/openlp_plugins/media/forms/test_mediaclipselectorform.py +++ b/tests/interfaces/openlp_plugins/media/forms/test_mediaclipselectorform.py @@ -81,7 +81,7 @@ class TestMediaClipSelectorForm(TestCase, TestMixin): Test if the dialog is correctly set up. """ # GIVEN: A mocked QDialog.exec() method - with patch('PyQt5.QtWidgets.QDialog.exec') as mocked_exec: + with patch('PyQt5.QtWidgets.QDialog.exec'): # WHEN: Show the dialog. self.form.exec() @@ -96,7 +96,7 @@ class TestMediaClipSelectorForm(TestCase, TestMixin): with patch('openlp.plugins.media.forms.mediaclipselectorform.critical_error_message_box') as \ mocked_critical_error_message_box,\ patch('openlp.plugins.media.forms.mediaclipselectorform.os.path.exists') as mocked_os_path_exists,\ - patch('PyQt5.QtWidgets.QDialog.exec') as mocked_exec: + patch('PyQt5.QtWidgets.QDialog.exec'): self.form.exec() # WHEN: The load button is clicked with no path set @@ -134,7 +134,7 @@ class TestMediaClipSelectorForm(TestCase, TestMixin): Test the behavior when the title combobox is updated """ # GIVEN: Mocked methods and some entries in the title combobox. - with patch('PyQt5.QtWidgets.QDialog.exec') as mocked_exec: + with patch('PyQt5.QtWidgets.QDialog.exec'): self.form.exec() self.form.vlc_media_player.get_length.return_value = 1000 self.form.audio_tracks_combobox.itemData = MagicMock() @@ -163,7 +163,7 @@ class TestMediaClipSelectorForm(TestCase, TestMixin): # GIVEN: Mocked methods. with patch('openlp.plugins.media.forms.mediaclipselectorform.critical_error_message_box') as \ mocked_critical_error_message_box,\ - patch('PyQt5.QtWidgets.QDialog.exec') as mocked_exec: + patch('PyQt5.QtWidgets.QDialog.exec'): self.form.exec() # WHEN: The save button is clicked with a NoneType in start_time_ms or end_time_ms diff --git a/tests/openlp_core/projectors/test_projector_sourceform.py b/tests/openlp_core/projectors/test_projector_sourceform.py index 3c6271ae5..cb81fc718 100644 --- a/tests/openlp_core/projectors/test_projector_sourceform.py +++ b/tests/openlp_core/projectors/test_projector_sourceform.py @@ -91,7 +91,7 @@ class ProjectorSourceFormTest(TestCase, TestMixin): if os.path.exists(TEST_DB): os.unlink(TEST_DB) break - except: + except Exception: time.sleep(1) retries += 1 self.destroy_settings()