From 4bed8eabeddc8b67fdd010b8dc570b05cbad83a4 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 26 Oct 2018 11:26:12 -0700 Subject: [PATCH 01/12] Attempt to remove/reduce circular imports --- openlp/plugins/custom/customplugin.py | 4 ++-- openlp/plugins/custom/forms/editcustomform.py | 6 +++--- openlp/plugins/custom/lib/__init__.py | 4 ---- openlp/plugins/custom/lib/mediaitem.py | 2 +- tests/functional/openlp_plugins/custom/test_mediaitem.py | 2 +- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/openlp/plugins/custom/customplugin.py b/openlp/plugins/custom/customplugin.py index 194553bfd..daf58ad41 100644 --- a/openlp/plugins/custom/customplugin.py +++ b/openlp/plugins/custom/customplugin.py @@ -33,9 +33,9 @@ from openlp.core.lib import build_icon from openlp.core.lib.plugin import Plugin, StringContent from openlp.core.lib.db import Manager 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 0ab518960..6ee171152 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -27,10 +27,10 @@ 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 77441d2a4..e01974fac 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -35,7 +35,7 @@ from openlp.core.lib.plugin import PluginStatus 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 CustomXMLParser, CustomXMLBuilder +from openlp.plugins.custom.lib.customxmlhandler import CustomXMLBuilder, CustomXMLParser from openlp.plugins.custom.lib.db import CustomSlide log = logging.getLogger(__name__) diff --git a/tests/functional/openlp_plugins/custom/test_mediaitem.py b/tests/functional/openlp_plugins/custom/test_mediaitem.py index e934adb10..5ce1bbaa0 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 FOOTER = ['Arky Arky (Unknown)', 'Public Domain', 'CCLI 123456'] From ec479e589b5b38b7eac1fcbfb1718eafb083ca49 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 26 Oct 2018 16:15:31 -0700 Subject: [PATCH 02/12] Fix a bunch of linting issues (which should also help resolve other circular dependencies) --- openlp/plugins/bibles/bibleplugin.py | 8 ++--- openlp/plugins/bibles/lib/__init__.py | 6 ---- .../plugins/bibles/lib/importers/csvbible.py | 1 - openlp/plugins/bibles/lib/mediaitem.py | 5 ++-- openlp/plugins/images/forms/__init__.py | 3 -- openlp/plugins/images/imageplugin.py | 4 ++- openlp/plugins/images/lib/__init__.py | 3 -- openlp/plugins/images/lib/mediaitem.py | 3 +- openlp/plugins/presentations/lib/__init__.py | 5 ---- openlp/plugins/presentations/lib/mediaitem.py | 4 +-- .../presentations/presentationplugin.py | 4 ++- openlp/plugins/songs/forms/__init__.py | 1 - openlp/plugins/songs/lib/__init__.py | 2 +- .../plugins/songs/lib/importers/cclifile.py | 2 -- openlp/plugins/songs/lib/songselect.py | 3 +- openlp/plugins/songusage/forms/__init__.py | 3 -- openlp/plugins/songusage/songusageplugin.py | 3 +- scripts/translation_utils.py | 2 +- setup.cfg | 3 +- .../openlp_plugins/bibles/test_csvimport.py | 29 ++++++++++++------- .../openlp_plugins/images/test_imagetab.py | 2 +- .../openlp_plugins/bibles/test_lib_manager.py | 3 +- .../bibles/test_lib_parse_reference.py | 3 +- 23 files changed, 47 insertions(+), 55 deletions(-) diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 85d903546..481f58a82 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -26,13 +26,13 @@ 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.ui.icons import UiIcons -from openlp.core.lib import build_icon from openlp.core.lib.plugin import Plugin, StringContent from openlp.core.lib.ui import create_action from openlp.plugins.bibles.endpoint import api_bibles_endpoint, bibles_endpoint -from openlp.plugins.bibles.lib import BibleManager, BiblesTab, BibleMediaItem, LayoutStyle, DisplayStyle, \ - LanguageSelection -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/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 29d22ff7d..ed753207a 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/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 32ca16bd6..faf3edfc2 100755 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -38,8 +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, get_reference_separator +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/images/forms/__init__.py b/openlp/plugins/images/forms/__init__.py index f7a6b947b..450f19e8a 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 cb6f91741..74572c0f8 100644 --- a/openlp/plugins/images/imageplugin.py +++ b/openlp/plugins/images/imageplugin.py @@ -32,7 +32,9 @@ from openlp.core.lib import ImageSource, build_icon from openlp.core.lib.plugin import Plugin, StringContent from openlp.core.lib.db import Manager 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 log = logging.getLogger(__name__) 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 b82da4e26..4bd34ebb9 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -38,7 +38,8 @@ from openlp.core.lib.plugin import StringContent 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 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/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index 468bd75f9..e392f4ee3 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, translate, get_natural_key from openlp.core.common.path import path_to_str, str_to_path @@ -33,7 +33,7 @@ from openlp.core.lib.mediamanageritem import MediaManagerItem from openlp.core.lib.serviceitem import ItemCapabilities from openlp.core.lib.ui import critical_error_message_box, create_horizontal_adjusting_combo_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 log = logging.getLogger(__name__) diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index c64df5cde..be23ba445 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -36,7 +36,9 @@ from openlp.core.common.settings import Settings from openlp.core.lib import build_icon from openlp.core.lib.plugin import Plugin, StringContent 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 b95871295..2bd280ffc 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/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index c86d822fd..1335cfc05 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -33,7 +33,7 @@ from openlp.core.common.applocation import AppLocation from openlp.core.common.i18n import translate from openlp.core.common.settings import Settings from openlp.core.lib import clean_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 1389918c1..0e2668836 100644 --- a/openlp/plugins/songs/lib/importers/cclifile.py +++ b/openlp/plugins/songs/lib/importers/cclifile.py @@ -289,10 +289,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/songselect.py b/openlp/plugins/songs/lib/songselect.py index 61de5b574..35f01888b 100644 --- a/openlp/plugins/songs/lib/songselect.py +++ b/openlp/plugins/songs/lib/songselect.py @@ -33,7 +33,8 @@ from urllib.request import HTTPCookieProcessor, URLError, build_opener from bs4 import BeautifulSoup, NavigableString -from openlp.plugins.songs.lib import Song, Author, Topic, VerseType, clean_song +from openlp.plugins.songs.lib import VerseType, clean_song +from openlp.plugins.songs.lib.db import Song, Author, Topic from openlp.plugins.songs.lib.openlyricsxml import SongXML USER_AGENTS = [ 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 a0dcff54f..87ab46c37 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -33,7 +33,8 @@ from openlp.core.lib.plugin import Plugin, StringContent from openlp.core.lib.db import Manager from openlp.core.lib.ui import create_action from openlp.core.ui.icons import UiIcons -from openlp.plugins.songusage.forms import SongUsageDetailForm, SongUsageDeleteForm +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 init_schema, SongUsageItem diff --git a/scripts/translation_utils.py b/scripts/translation_utils.py index 44f2476f5..f6eac49aa 100755 --- a/scripts/translation_utils.py +++ b/scripts/translation_utils.py @@ -58,7 +58,7 @@ import urllib.request import webbrowser from PyQt5 import QtCore -from lxml import etree, objectify +from lxml import objectify SERVER_URL = 'http://www.transifex.com/api/2/project/openlp/resource/openlp-26x/' IGNORED_PATHS = ['scripts'] diff --git a/setup.cfg b/setup.cfg index 223e5c7c2..11ca74af3 100644 --- a/setup.cfg +++ b/setup.cfg @@ -10,7 +10,7 @@ ignore = E402 [flake8] exclude=resources.py,vlc.py max-line-length = 120 -ignore = E402 +ignore = D200,E402,W503,W504 [pycodestyle] exclude = resources.py,vlc.py @@ -21,4 +21,3 @@ max-line-length = 120 # W503 line break before binary operator # W504 line break after binary operator ignore = E402,E722,W503,W504 - diff --git a/tests/functional/openlp_plugins/bibles/test_csvimport.py b/tests/functional/openlp_plugins/bibles/test_csvimport.py index db07706eb..6908da7b7 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 @@ -131,35 +131,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): @@ -167,15 +172,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/images/test_imagetab.py b/tests/functional/openlp_plugins/images/test_imagetab.py index 813be4e88..7bd705a4f 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 __default_settings__ = { 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 bf1057667..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, parse_reference, LanguageSelection +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 From d1c4cea7775828cfbd4d2f2d02ed77f5f8bfce5b Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 26 Oct 2018 18:40:20 -0700 Subject: [PATCH 03/12] Fix linting issues --- openlp/core/api/__init__.py | 7 ------ openlp/core/api/endpoint/__init__.py | 1 - openlp/core/api/http/__init__.py | 1 - openlp/core/api/poll.py | 6 ++--- openlp/core/common/i18n.py | 2 +- openlp/core/lib/db.py | 8 +++---- openlp/core/lib/serviceitem.py | 2 +- openlp/core/projectors/manager.py | 14 +++++------ openlp/core/ui/exceptiondialog.py | 2 +- openlp/core/ui/exceptionform.py | 2 +- openlp/core/ui/icons.py | 2 +- openlp/core/ui/maindisplay.py | 4 ++-- openlp/core/ui/media/__init__.py | 7 ------ .../core/ui/media/vendor/mediainfoWrapper.py | 6 ++--- openlp/core/ui/media/vlcplayer.py | 6 ++--- openlp/core/ui/slidecontroller.py | 2 +- openlp/core/version.py | 3 --- openlp/core/widgets/edits.py | 1 - openlp/core/widgets/views.py | 2 +- openlp/core/widgets/wizard.py | 1 - openlp/plugins/alerts/endpoint.py | 1 - openlp/plugins/alerts/forms/__init__.py | 2 -- openlp/plugins/alerts/lib/__init__.py | 3 --- .../plugins/bibles/forms/bibleimportform.py | 6 ++--- openlp/plugins/bibles/lib/manager.py | 2 +- openlp/plugins/media/lib/__init__.py | 5 ---- .../presentations/lib/impresscontroller.py | 16 ++++++------- .../lib/presentationcontroller.py | 4 ++-- openlp/plugins/songs/forms/editsongform.py | 4 ++-- .../plugins/songs/lib/importers/openoffice.py | 6 ++--- .../songs/lib/importers/songshowplus.py | 2 +- tests/functional/openlp_core/api/test_tab.py | 1 - .../functional/openlp_core/common/test_db.py | 2 +- .../openlp_core/common/test_path.py | 2 +- tests/functional/openlp_core/lib/test_lib.py | 24 +++++++++---------- .../openlp_core/ui/media/test_vlcplayer.py | 11 ++++----- tests/functional/openlp_core/ui/test_icons.py | 4 ++-- .../openlp_core/ui/test_maindisplay.py | 2 +- .../openlp_core/ui/test_servicemanager.py | 1 - .../openlp_plugins/bibles/test_lib.py | 2 +- .../openlp_plugins/bibles/test_mediaitem.py | 8 +++---- .../openlp_plugins/bibles/test_upgrade.py | 2 -- .../presentations/test_impresscontroller.py | 1 - .../openlp_plugins/songs/test_lib.py | 2 +- .../openlp_plugins/songs/test_mediashout.py | 4 ++-- .../openlp_core/common/test_utils.py | 1 - .../bibles/forms/test_bibleimportform.py | 1 - .../custom/forms/test_customform.py | 2 +- .../custom/forms/test_customslideform.py | 4 ++-- .../media/forms/test_mediaclipselectorform.py | 8 +++---- .../projectors/test_projector_sourceform.py | 2 +- 51 files changed, 87 insertions(+), 127 deletions(-) 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 56e6be724..0f89ed076 100644 --- a/openlp/core/common/i18n.py +++ b/openlp/core/common/i18n.py @@ -522,7 +522,7 @@ def get_locale_key(string): icu_locale = icu.Locale(language) ICU_COLLATOR = icu.Collator.createInstance(icu_locale) return ICU_COLLATOR.getSortKey(string) - except: + except Exception: return locale.strxfrm(string).encode() diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index 6898e0469..4edc5835a 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -408,7 +408,7 @@ class Manager(object): self.session.rollback() log.exception('Object list save failed') return False - except: + except Exception: self.session.rollback() raise @@ -438,7 +438,7 @@ class Manager(object): self.session.rollback() log.exception('Object list save failed') return False - except: + except Exception: self.session.rollback() raise @@ -555,7 +555,7 @@ class Manager(object): self.session.rollback() log.exception('Failed to delete object') return False - except: + except Exception: self.session.rollback() raise else: @@ -590,7 +590,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/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 18984f172..6e0715047 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -39,7 +39,7 @@ from openlp.core.ui.icons import UiIcons from openlp.core.common.mixins import RegistryProperties from openlp.core.common.path import Path from openlp.core.common.settings import Settings -from openlp.core.lib import ImageSource, build_icon, clean_tags, expand_tags, expand_chords +from openlp.core.lib import ImageSource, clean_tags, expand_tags, expand_chords log = logging.getLogger(__name__) diff --git a/openlp/core/projectors/manager.py b/openlp/core/projectors/manager.py index add7cd4c0..ec77128bb 100644 --- a/openlp/core/projectors/manager.py +++ b/openlp/core/projectors/manager.py @@ -470,7 +470,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): @@ -485,7 +485,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 @@ -504,7 +504,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): @@ -586,7 +586,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): @@ -619,7 +619,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): @@ -637,7 +637,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): @@ -655,7 +655,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 e24dc5b90..96ff38562 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.ui.icons import UiIcons diff --git a/openlp/core/ui/exceptionform.py b/openlp/core/ui/exceptionform.py index b981bddbc..73bcc4b53 100644 --- a/openlp/core/ui/exceptionform.py +++ b/openlp/core/ui/exceptionform.py @@ -241,5 +241,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 9d4102579..1a8839c96 100644 --- a/openlp/core/ui/icons.py +++ b/openlp/core/ui/icons.py @@ -175,7 +175,7 @@ class UiIcons(object): import sys log.error("Unexpected error: %s" % sys.exc_info()) setattr(self, key, qta.icon('fa.plus-circle', color='red')) - except: + except KeyError: 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/maindisplay.py b/openlp/core/ui/maindisplay.py index d07884d36..996e69836 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -172,7 +172,7 @@ class MainDisplay(Display, LogMixin, RegistryProperties): # Get a pointer to the underlying NSView try: nsview_pointer = self.winId().ascapsule() - except: + except Exception: nsview_pointer = voidptr(self.winId()).ascapsule() # Set PyCapsule name so pyobjc will accept it pythonapi.PyCapsule_SetName.restype = c_void_p @@ -582,7 +582,7 @@ class MainDisplay(Display, LogMixin, RegistryProperties): window_id = window.winId().__int__() main_window_id = self.main_window.winId().__int__() self_id = self.winId().__int__() - except: + except Exception: return # If the passed window has the same id as our window make sure the display has the proper level and # collection behavior. 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 d28fe1395..649210611 100644 --- a/openlp/core/ui/media/vendor/mediainfoWrapper.py +++ b/openlp/core/ui/media/vendor/mediainfoWrapper.py @@ -37,7 +37,7 @@ class Track(object): def __getattribute__(self, name): try: return object.__getattribute__(self, name) - except: + except Exception: pass return None @@ -63,14 +63,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 13888e28d..45f66332f 100644 --- a/openlp/core/ui/media/vlcplayer.py +++ b/openlp/core/ui/media/vlcplayer.py @@ -69,7 +69,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'] @@ -106,7 +106,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 @@ -130,7 +130,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/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 12c3abdab..e2f942b13 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -36,7 +36,7 @@ from openlp.core.common.mixins import LogMixin, RegistryProperties from openlp.core.common.registry import Registry, RegistryBase from openlp.core.common.settings import Settings from openlp.core.display.screens import ScreenList -from openlp.core.lib import ImageSource, ServiceItemAction, build_icon +from openlp.core.lib import ImageSource, ServiceItemAction from openlp.core.lib.htmlbuilder import build_html from openlp.core.lib.serviceitem import ServiceItem, ItemCapabilities from openlp.core.lib.ui import create_action diff --git a/openlp/core/version.py b/openlp/core/version.py index 938a8d3ce..3a57908e5 100644 --- a/openlp/core/version.py +++ b/openlp/core/version.py @@ -24,11 +24,8 @@ The :mod:`openlp.core.version` module downloads the version details for OpenLP. """ import logging import platform -import sys -import time from datetime import date from distutils.version import LooseVersion -from subprocess import Popen, PIPE import requests from PyQt5 import QtCore diff --git a/openlp/core/widgets/edits.py b/openlp/core/widgets/edits.py index 3333df633..adab9c25f 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_widget_action, create_action from openlp.core.ui.icons import UiIcons diff --git a/openlp/core/widgets/views.py b/openlp/core/widgets/views.py index bcb097fca..6429cb613 100644 --- a/openlp/core/widgets/views.py +++ b/openlp/core/widgets/views.py @@ -135,7 +135,7 @@ class ListPreviewWidget(QtWidgets.QTableWidget, RegistryProperties): # Get and validate label widget containing slide & adjust max width try: self.cellWidget(row, 0).children()[1].setMaximumWidth(new_height * self.screen_ratio) - except: + except Exception: return def screen_size_changed(self, screen_ratio): diff --git a/openlp/core/widgets/wizard.py b/openlp/core/widgets/wizard.py index 5bd9f337f..3df3b76a8 100644 --- a/openlp/core/widgets/wizard.py +++ b/openlp/core/widgets/wizard.py @@ -32,7 +32,6 @@ from openlp.core.ui.icons import UiIcons 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.widgets.dialogs import FileDialog diff --git a/openlp/plugins/alerts/endpoint.py b/openlp/plugins/alerts/endpoint.py index 542d5ef37..85d534ee3 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 ff297ae8f..450f19e8a 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/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 912ab26e5..974d7c25a 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -31,7 +31,7 @@ from lxml import etree try: from pysword import modules PYSWORD_AVAILABLE = True -except: +except ImportError: PYSWORD_AVAILABLE = False from openlp.core.common import trace_error_handler @@ -613,7 +613,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): @@ -628,7 +628,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/manager.py b/openlp/plugins/bibles/lib/manager.py index fce411870..4725d4066 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -38,7 +38,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/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/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 6bd05e2b1..1c9506f51 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -121,7 +121,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 @@ -130,7 +130,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 @@ -172,7 +172,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 @@ -190,7 +190,7 @@ class ImpressController(PresentationController): try: desktop.terminate() log.debug('OpenOffice killed') - except: + except Exception: log.warning('Failed to terminate OpenOffice') @@ -235,7 +235,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() @@ -274,7 +274,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): @@ -302,7 +302,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) @@ -319,7 +319,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/presentationcontroller.py b/openlp/plugins/presentations/lib/presentationcontroller.py index a7b9a7d7d..fb27193f5 100644 --- a/openlp/plugins/presentations/lib/presentationcontroller.py +++ b/openlp/plugins/presentations/lib/presentationcontroller.py @@ -326,14 +326,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/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 06ca0d893..c292e22a0 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -319,7 +319,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 @@ -1087,7 +1087,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/importers/openoffice.py b/openlp/plugins/songs/lib/importers/openoffice.py index e1862c936..7f06b9d3d 100644 --- a/openlp/plugins/songs/lib/importers/openoffice.py +++ b/openlp/plugins/songs/lib/importers/openoffice.py @@ -134,7 +134,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): @@ -176,7 +176,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 @@ -187,7 +187,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 ceadbdf8f..15a611f9d 100644 --- a/openlp/plugins/songs/lib/importers/songshowplus.py +++ b/openlp/plugins/songs/lib/importers/songshowplus.py @@ -223,5 +223,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/tests/functional/openlp_core/api/test_tab.py b/tests/functional/openlp_core/api/test_tab.py index 1f61673f4..2c6758c46 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 7fe59b35f..5147bf589 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_path.py b/tests/functional/openlp_core/common/test_path.py index 8581d9b49..c28900639 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 446a34f3c..15fa7c2fa 100644 --- a/tests/functional/openlp_core/lib/test_lib.py +++ b/tests/functional/openlp_core/lib/test_lib.py @@ -280,7 +280,7 @@ class TestLib(TestCase): # last test. try: thumb_path.unlink() - except: + except Exception: pass # Only continue when the thumb does not exist. @@ -298,7 +298,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): @@ -314,7 +314,7 @@ class TestLib(TestCase): # last test. try: thumb_path.unlink() - except: + except Exception: pass # Only continue when the thumb does not exist. @@ -332,7 +332,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): @@ -349,7 +349,7 @@ class TestLib(TestCase): # last test. try: thumb_path.unlink() - except: + except Exception: pass # Only continue when the thumb does not exist. @@ -367,7 +367,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): @@ -384,7 +384,7 @@ class TestLib(TestCase): # last test. try: thumb_path.unlink() - except: + except Exception: pass # Only continue when the thumb does not exist. @@ -402,7 +402,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): @@ -419,7 +419,7 @@ class TestLib(TestCase): # last test. try: thumb_path.unlink() - except: + except Exception: pass # Only continue when the thumb does not exist. @@ -437,7 +437,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): @@ -455,7 +455,7 @@ class TestLib(TestCase): # last test. try: thumb_path.unlink() - except: + except Exception: pass # Only continue when the thumb does not exist. @@ -485,7 +485,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_check_item_selected_true(self): diff --git a/tests/functional/openlp_core/ui/media/test_vlcplayer.py b/tests/functional/openlp_core/ui/media/test_vlcplayer.py index 24c929563..dff4e2084 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_icons.py b/tests/functional/openlp_core/ui/test_icons.py index cea393311..5057c7dea 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_maindisplay.py b/tests/functional/openlp_core/ui/test_maindisplay.py index b72a3cb3e..0605c5f65 100644 --- a/tests/functional/openlp_core/ui/test_maindisplay.py +++ b/tests/functional/openlp_core/ui/test_maindisplay.py @@ -172,7 +172,7 @@ class TestMainDisplay(TestCase, TestMixin): main_display = MainDisplay(display) try: nsview_pointer = main_display.winId().ascapsule() - except: + except Exception: nsview_pointer = voidptr(main_display.winId()).ascapsule() pythonapi.PyCapsule_SetName.restype = c_void_p pythonapi.PyCapsule_SetName.argtypes = [py_object, c_char_p] diff --git a/tests/functional/openlp_core/ui/test_servicemanager.py b/tests/functional/openlp_core/ui/test_servicemanager.py index 89080f835..bc9d84abd 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_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 2e7d76e90..69c29a2d6 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/presentations/test_impresscontroller.py b/tests/functional/openlp_plugins/presentations/test_impresscontroller.py index d3a911cec..321a5dc21 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 09011a3e3..876503298 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_mediashout.py b/tests/functional/openlp_plugins/songs/test_mediashout.py index 15adfded0..ffa448406 100644 --- a/tests/functional/openlp_plugins/songs/test_mediashout.py +++ b/tests/functional/openlp_plugins/songs/test_mediashout.py @@ -99,7 +99,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() @@ -133,7 +133,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 300eb2c0b..90abd6469 100644 --- a/tests/interfaces/openlp_core/common/test_utils.py +++ b/tests/interfaces/openlp_core/common/test_utils.py @@ -25,7 +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.utils.constants import RESOURCE_PATH from tests.helpers.testmixin import TestMixin 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/custom/forms/test_customform.py b/tests/interfaces/openlp_plugins/custom/forms/test_customform.py index 96f265970..8f3ae7b24 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 69e98da5d..00df6d3cf 100644 --- a/tests/interfaces/openlp_plugins/media/forms/test_mediaclipselectorform.py +++ b/tests/interfaces/openlp_plugins/media/forms/test_mediaclipselectorform.py @@ -79,7 +79,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() @@ -94,7 +94,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 @@ -132,7 +132,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() @@ -161,7 +161,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 65c3eea99..b10a0e0ec 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() From 417912aae24b37a6fa2bcd5051d91e1e6b8adfec Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 26 Oct 2018 18:53:43 -0700 Subject: [PATCH 04/12] Fix the tests --- openlp/core/ui/icons.py | 4 ++-- openlp/core/ui/mainwindow.py | 2 +- openlp/core/ui/settingsform.py | 2 +- openlp/plugins/alerts/alertsplugin.py | 5 +++-- openlp/plugins/media/mediaplugin.py | 3 ++- tests/functional/openlp_core/api/http/test_wsgiapp.py | 3 ++- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/openlp/core/ui/icons.py b/openlp/core/ui/icons.py index 1a8839c96..57b7f77b1 100644 --- a/openlp/core/ui/icons.py +++ b/openlp/core/ui/icons.py @@ -173,9 +173,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 KeyError: + 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 84b652824..e129fe6d2 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -57,7 +57,7 @@ from openlp.core.ui.pluginform import PluginForm from openlp.core.ui.slidecontroller import LiveController, PreviewController from openlp.core.ui.settingsform import SettingsForm from openlp.core.ui.firsttimeform import FirstTimeForm -from openlp.core.ui.media import MediaController +from openlp.core.ui.media.mediacontroller import MediaController from openlp.core.ui.printserviceform import PrintServiceForm from openlp.core.ui.style import PROGRESSBAR_STYLE, get_library_stylesheet from openlp.core.version import get_version diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py index fc8b4e74e..b01381e80 100644 --- a/openlp/core/ui/settingsform.py +++ b/openlp/core/ui/settingsform.py @@ -34,7 +34,7 @@ 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.themestab import ThemesTab -from openlp.core.ui.media import PlayerTab +from openlp.core.ui.media.playertab import PlayerTab from openlp.core.ui.settingsdialog import Ui_SettingsDialog log = logging.getLogger(__name__) diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index f65be76be..34cdf5bf7 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -35,8 +35,9 @@ 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 api_alerts_endpoint, alerts_endpoint -from openlp.plugins.alerts.forms import AlertForm -from openlp.plugins.alerts.lib import AlertsManager, AlertsTab +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 log = logging.getLogger(__name__) diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index 1b3130705..c48ef9b29 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -36,7 +36,8 @@ from openlp.core.common.path import Path from openlp.core.lib import build_icon from openlp.core.lib.plugin import Plugin, StringContent 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/tests/functional/openlp_core/api/http/test_wsgiapp.py b/tests/functional/openlp_core/api/http/test_wsgiapp.py index a7cf331b5..8f8048b6d 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 register_endpoint, application, NotFound +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__)) From fd36a01cd667e44d588eb8694eaffd7c4fa5815e Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 26 Oct 2018 20:49:34 -0700 Subject: [PATCH 05/12] Remove incorrect faulthandler initialisation --- run_openlp.py | 1 - 1 file changed, 1 deletion(-) diff --git a/run_openlp.py b/run_openlp.py index 89f89db61..ec97ca457 100755 --- a/run_openlp.py +++ b/run_openlp.py @@ -46,7 +46,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 From e3b46b9430c60b7d4ad2fbe8356b1e593db58867 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 26 Oct 2018 21:02:57 -0700 Subject: [PATCH 06/12] Disable docstring linting --- setup.cfg | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/setup.cfg b/setup.cfg index 11ca74af3..393602f22 100644 --- a/setup.cfg +++ b/setup.cfg @@ -10,14 +10,13 @@ ignore = E402 [flake8] exclude=resources.py,vlc.py max-line-length = 120 -ignore = D200,E402,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 From dc5a9590ba6c390a50e836a11121a30551a9d5b1 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 26 Oct 2018 21:13:33 -0700 Subject: [PATCH 07/12] Fix up some more linting issues --- openlp/core/ui/servicemanager.py | 2 +- openlp/plugins/bibles/forms/bibleimportform.py | 2 +- openlp/plugins/bibles/lib/importers/http.py | 2 +- openlp/plugins/presentations/lib/pdfcontroller.py | 2 +- openlp/plugins/songs/lib/importers/easyslides.py | 2 +- openlp/plugins/songs/lib/importers/sundayplus.py | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index a1deab320..97ac30727 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/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 974d7c25a..02993ab2d 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -583,7 +583,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.')) diff --git a/openlp/plugins/bibles/lib/importers/http.py b/openlp/plugins/bibles/lib/importers/http.py index c624210be..9e5c8a152 100644 --- a/openlp/plugins/bibles/lib/importers/http.py +++ b/openlp/plugins/bibles/lib/importers/http.py @@ -749,7 +749,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/presentations/lib/pdfcontroller.py b/openlp/plugins/presentations/lib/pdfcontroller.py index 126442af3..29a8026b9 100644 --- a/openlp/plugins/presentations/lib/pdfcontroller.py +++ b/openlp/plugins/presentations/lib/pdfcontroller.py @@ -279,7 +279,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/songs/lib/importers/easyslides.py b/openlp/plugins/songs/lib/importers/easyslides.py index 4a6fc5bf8..28a9a39b2 100644 --- a/openlp/plugins/songs/lib/importers/easyslides.py +++ b/openlp/plugins/songs/lib/importers/easyslides.py @@ -107,7 +107,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/sundayplus.py b/openlp/plugins/songs/lib/importers/sundayplus.py index 180c76e19..595575af3 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): From 6aa998edd0f57094aa102912514f50b8a3da5ee0 Mon Sep 17 00:00:00 2001 From: Bastian Germann Date: Sat, 27 Oct 2018 12:50:15 +0200 Subject: [PATCH 08/12] Replace PyICU with PyQt's QCollator Use QCollator as new collator to get rid of the PyICU dependency. Simplify the natural sorting with its numeric mode. Simplify one test that is heavily dependent on implementation. Run one sorting test on macOS which was disabled. --- openlp/core/common/i18n.py | 30 +++++----------- openlp/core/ui/exceptionform.py | 12 ++----- openlp/plugins/songs/lib/mediaitem.py | 6 ++-- scripts/appveyor.yml | 14 ++++---- scripts/check_dependencies.py | 5 ++- setup.py | 9 ++--- .../openlp_core/common/test_i18n.py | 1 - .../openlp_core/ui/test_exceptionform.py | 3 +- .../openlp_plugins/songs/test_mediaitem.py | 34 ++++++++----------- 9 files changed, 41 insertions(+), 73 deletions(-) diff --git a/openlp/core/common/i18n.py b/openlp/core/common/i18n.py index 0f89ed076..7c5b432d1 100644 --- a/openlp/core/common/i18n.py +++ b/openlp/core/common/i18n.py @@ -52,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'), @@ -506,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 Exception: - 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): @@ -533,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/ui/exceptionform.py b/openlp/core/ui/exceptionform.py index 73bcc4b53..4c795c8fb 100644 --- a/openlp/core/ui/exceptionform.py +++ b/openlp/core/ui/exceptionform.py @@ -52,14 +52,6 @@ try: MAKO_VERSION = mako.__version__ except ImportError: MAKO_VERSION = '-' -try: - import icu - try: - ICU_VERSION = icu.VERSION - except AttributeError: - ICU_VERSION = 'OK' -except ImportError: - ICU_VERSION = '-' try: WEBKIT_VERSION = QtWebKit.qWebKitVersion() except AttributeError: @@ -119,12 +111,12 @@ class ExceptionForm(QtWidgets.QDialog, Ui_ExceptionDialog, RegistryProperties): system = translate('OpenLP.ExceptionForm', 'Platform: {platform}\n').format(platform=platform.platform()) libraries = ('Python: {python}\nQt5: {qt5}\nPyQt5: {pyqt5}\nQtWebkit: {qtwebkit}\nSQLAlchemy: {sqalchemy}\n' 'SQLAlchemy Migrate: {migrate}\nBeautifulSoup: {soup}\nlxml: {etree}\nChardet: {chardet}\n' - 'PyEnchant: {enchant}\nMako: {mako}\npyICU: {icu}\npyUNO bridge: {uno}\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, qtwebkit=WEBKIT_VERSION, sqalchemy=sqlalchemy.__version__, migrate=MIGRATE_VERSION, soup=bs4.__version__, etree=etree.__version__, chardet=CHARDET_VERSION, - enchant=ENCHANT_VERSION, mako=MAKO_VERSION, icu=ICU_VERSION, + enchant=ENCHANT_VERSION, mako=MAKO_VERSION, uno=self._pyuno_import(), vlc=VLC_VERSION) if is_linux(): diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 51f4d0407..ca7f8dffd 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -324,12 +324,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/scripts/appveyor.yml b/scripts/appveyor.yml index bef8cb5e5..64a771ab3 100644 --- a/scripts/appveyor.yml +++ b/scripts/appveyor.yml @@ -12,19 +12,17 @@ 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==4.0.8 psycopg2 pypiwin32==219 pyenchant pymediainfo websockets asyncio waitress six webob requests QtAwesome" - # 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-1.9.5-cp34-cp34m-win32.whl" # Download and install PyQt5 - - appveyor DownloadFile http://downloads.sourceforge.net/project/pyqt/PyQt5/PyQt-5.5.1/PyQt5-5.5.1-gpl-Py3.4-Qt5.5.1-x32.exe + - appveyor DownloadFile https://downloads.sourceforge.net/project/pyqt/PyQt5/PyQt-5.5.1/PyQt5-5.5.1-gpl-Py3.4-Qt5.5.1-x32.exe - PyQt5-5.5.1-gpl-Py3.4-Qt5.5.1-x32.exe /S # 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 3dfb341d8..cffee7bba 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/setup.py b/setup.py index bdd4c6e94..4fa594f86 100755 --- a/setup.py +++ b/setup.py @@ -119,7 +119,7 @@ requires = [ 'lxml', 'Mako', 'pymediainfo >= 2.2', - 'PyQt5', + 'PyQt5 >= 5.5', 'QtAwesome', 'requests', 'SQLAlchemy >= 0.5', @@ -128,10 +128,7 @@ requires = [ 'websockets' ] if sys.platform.startswith('win'): - requires.extend([ - 'PyICU', - 'pywin32' - ]) + requires.append('pywin32') elif sys.platform.startswith('darwin'): requires.extend([ 'pyobjc', @@ -204,7 +201,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/common/test_i18n.py b/tests/functional/openlp_core/common/test_i18n.py index a4b896c6b..6838bc345 100644 --- a/tests/functional/openlp_core/common/test_i18n.py +++ b/tests/functional/openlp_core/common/test_i18n.py @@ -113,7 +113,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/ui/test_exceptionform.py b/tests/functional/openlp_core/ui/test_exceptionform.py index 207805f37..71cc419eb 100644 --- a/tests/functional/openlp_core/ui/test_exceptionform.py +++ b/tests/functional/openlp_core/ui/test_exceptionform.py @@ -37,7 +37,6 @@ 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' @@ -46,7 +45,7 @@ MAIL_ITEM_TEXT = ('**OpenLP Bug Report**\nVersion: Trunk Test\n\n--- Details of 'Python: Python Test\nQt5: Qt5 test\nPyQt5: PyQt5 Test\nQtWebkit: Webkit 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' - 'pyICU: ICU Test\npyUNO bridge: UNO Bridge Test\nVLC: VLC Test\n\n') + 'pyUNO bridge: UNO Bridge Test\nVLC: VLC Test\n\n') @patch("openlp.core.ui.exceptionform.Qt.qVersion") diff --git a/tests/functional/openlp_plugins/songs/test_mediaitem.py b/tests/functional/openlp_plugins/songs/test_mediaitem.py index a63e16a72..6b33a1d1d 100644 --- a/tests/functional/openlp_plugins/songs/test_mediaitem.py +++ b/tests/functional/openlp_plugins/songs/test_mediaitem.py @@ -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): """ From 191273fbe8b80bb5eac30776608a92f72070eecc Mon Sep 17 00:00:00 2001 From: Bastian Germann Date: Sat, 27 Oct 2018 13:05:41 +0200 Subject: [PATCH 09/12] Remove unused imports --- openlp/core/common/i18n.py | 1 - tests/functional/openlp_core/common/test_i18n.py | 2 -- tests/functional/openlp_plugins/songs/test_mediaitem.py | 2 +- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/openlp/core/common/i18n.py b/openlp/core/common/i18n.py index 7c5b432d1..b2579d132 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 diff --git a/tests/functional/openlp_core/common/test_i18n.py b/tests/functional/openlp_core/common/test_i18n.py index 6838bc345..2edc44b2e 100644 --- a/tests/functional/openlp_core/common/test_i18n.py +++ b/tests/functional/openlp_core/common/test_i18n.py @@ -22,10 +22,8 @@ """ 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, UiStrings, get_language, get_locale_key, get_natural_key, \ translate, LanguageManager from openlp.core.common.settings import Settings diff --git a/tests/functional/openlp_plugins/songs/test_mediaitem.py b/tests/functional/openlp_plugins/songs/test_mediaitem.py index 6b33a1d1d..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, patch, call +from unittest.mock import MagicMock, patch from PyQt5 import QtCore From 820476767f23f52966db3500357b262a9d692562 Mon Sep 17 00:00:00 2001 From: Bastian Germann Date: Sat, 27 Oct 2018 23:31:14 +0200 Subject: [PATCH 10/12] Do not export any tests* module --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index bdd4c6e94..c78c3941c 100755 --- a/setup.py +++ b/setup.py @@ -188,7 +188,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, From 2dc3d42fa9b39f4566b8f974380f0ef508970053 Mon Sep 17 00:00:00 2001 From: Bastian Germann Date: Sun, 28 Oct 2018 12:42:09 +0100 Subject: [PATCH 11/12] Include tests in sdist --- MANIFEST.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From bad6212008273b1bf028c0558b7bd0b8069a73a8 Mon Sep 17 00:00:00 2001 From: Bastian Germann Date: Mon, 29 Oct 2018 00:24:55 +0100 Subject: [PATCH 12/12] Test Py 3.7 compatibility --- tests/functional/openlp_core/api/http/test_wsgiapp.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/functional/openlp_core/api/http/test_wsgiapp.py b/tests/functional/openlp_core/api/http/test_wsgiapp.py index 8f8048b6d..2d087c55c 100644 --- a/tests/functional/openlp_core/api/http/test_wsgiapp.py +++ b/tests/functional/openlp_core/api/http/test_wsgiapp.py @@ -69,7 +69,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'