← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~sam92/openlp/fixes22 into lp:openlp

 

Samuel Mehrbrodt has proposed merging lp:~sam92/openlp/fixes22 into lp:openlp.

Requested reviews:
  Tim Bentley (trb143)
  Tomas Groth (tomasgroth)

For more details, see:
https://code.launchpad.net/~sam92/openlp/fixes22/+merge/280925

Small fixes:
  * Multiple '%s' in one string need to be named for translations (otherwise the order might get confused)
  * OpenLP 2.0 -> OpenLP 2
  * Change buttons of "Do you really want to close" dialog: Instead of ("No", "Yes") use ("Cancel", "Close OpenLP")
  * Improve exception dialog (mention that description should be english and relevant files should be attached)
  * Do not translate the bug report labels
  * Ignore "E402 module level import not at top of file" pep8 errors (added to setup.cfg)
  * Fix remaining PEP8 errors
  * Add import test for Words of Worship

lp:~sam92/openlp/fixes22 (revision 2562)
[SUCCESS] https//ci.openlp.io/job/Branch-01-Pull/1195/
[SUCCESS] https//ci.openlp.io/job/Branch-02-Functional-Tests/1118/
[SUCCESS] https//ci.openlp.io/job/Branch-03-Interface-Tests/1059/
[SUCCESS] https//ci.openlp.io/job/Branch-04a-Windows_Functional_Tests/906/
[SUCCESS] https//ci.openlp.io/job/Branch-04b-Windows_Interface_Tests/502/
[SUCCESS] https//ci.openlp.io/job/Branch-05a-Code_Analysis/617/
[SUCCESS] https//ci.openlp.io/job/Branch-05b-Test_Coverage/488/
-- 
Your team OpenLP Core is subscribed to branch lp:openlp.
=== modified file 'openlp/core/ui/exceptiondialog.py'
--- openlp/core/ui/exceptiondialog.py	2015-01-18 13:39:21 +0000
+++ openlp/core/ui/exceptiondialog.py	2015-12-17 21:47:02 +0000
@@ -90,14 +90,15 @@
         """
         exception_dialog.setWindowTitle(translate('OpenLP.ExceptionDialog', 'Error Occurred'))
         self.description_explanation.setText(
-            translate('OpenLP.ExceptionDialog', 'Please enter a description of what you were doing to cause this error '
+            translate('OpenLP.ExceptionDialog', 'Please enter a description of what you were doing to cause this error.'
+                                                ' If possible, write in English.'
                                                 '\n(Minimum 20 characters)'))
         self.message_label.setText(
             translate('OpenLP.ExceptionDialog', 'Oops! OpenLP hit a problem, and couldn\'t recover. The text in the '
                                                 'box below contains information that might be helpful to the OpenLP '
                                                 'developers, so please e-mail it to bugs@xxxxxxxxxx, along with a '
                                                 'detailed description of what you were doing when the problem '
-                                                'occurred.'))
+                                                'occurred. Also attach any files that triggered the problem.'))
         self.send_report_button.setText(translate('OpenLP.ExceptionDialog', 'Send E-Mail'))
         self.save_report_button.setText(translate('OpenLP.ExceptionDialog', 'Save to File'))
         self.attach_tile_button.setText(translate('OpenLP.ExceptionDialog', 'Attach File'))

=== modified file 'openlp/core/ui/exceptionform.py'
--- openlp/core/ui/exceptionform.py	2015-01-18 13:39:21 +0000
+++ openlp/core/ui/exceptionform.py	2015-12-17 21:47:02 +0000
@@ -97,6 +97,12 @@
         super(ExceptionForm, self).__init__()
         self.setupUi(self)
         self.settings_section = 'crashreport'
+        self.report_text = '**OpenLP Bug Report**\n' \
+            'Version: %s\n\n' \
+            '--- Details of the Exception. ---\n\n%s\n\n ' \
+            '--- Exception Traceback ---\n%s\n' \
+            '--- System information ---\n%s\n' \
+            '--- Library Versions ---\n%s\n'
 
     def exec_(self):
         """
@@ -143,13 +149,6 @@
         """
         Saving exception log and system information to a file.
         """
-        report_text = translate('OpenLP.ExceptionForm',
-                                '**OpenLP Bug Report**\n'
-                                'Version: %s\n\n'
-                                '--- Details of the Exception. ---\n\n%s\n\n '
-                                '--- Exception Traceback ---\n%s\n'
-                                '--- System information ---\n%s\n'
-                                '--- Library Versions ---\n%s\n')
         filename = QtGui.QFileDialog.getSaveFileName(
             self,
             translate('OpenLP.ExceptionForm', 'Save Crash Report'),
@@ -158,7 +157,7 @@
         if filename:
             filename = str(filename).replace('/', os.path.sep)
             Settings().setValue(self.settings_section + '/last directory', os.path.dirname(filename))
-            report_text = report_text % self._create_report()
+            report_text = self.report_text % self._create_report()
             try:
                 report_file = open(filename, 'w')
                 try:
@@ -178,14 +177,6 @@
         """
         Opening systems default email client and inserting exception log and system information.
         """
-        body = translate('OpenLP.ExceptionForm',
-                         '*OpenLP Bug Report*\n'
-                         'Version: %s\n\n'
-                         '--- Details of the Exception. ---\n\n%s\n\n '
-                         '--- Exception Traceback ---\n%s\n'
-                         '--- System information ---\n%s\n'
-                         '--- Library Versions ---\n%s\n',
-                         'Please add the information that bug reports are favoured written in English.')
         content = self._create_report()
         source = ''
         exception = ''
@@ -197,7 +188,7 @@
         subject = 'Bug report: %s in %s' % (exception, source)
         mail_to_url = QtCore.QUrl('mailto:bugs@xxxxxxxxxx')
         mail_to_url.addQueryItem('subject', subject)
-        mail_to_url.addQueryItem('body', body % content)
+        mail_to_url.addQueryItem('body', self.report_text % content)
         if self.file_attachment:
             mail_to_url.addQueryItem('attach', self.file_attachment)
         QtGui.QDesktopServices.openUrl(mail_to_url)

=== modified file 'openlp/core/ui/formattingtagcontroller.py'
--- openlp/core/ui/formattingtagcontroller.py	2015-02-27 21:14:08 +0000
+++ openlp/core/ui/formattingtagcontroller.py	2015-12-17 21:47:02 +0000
@@ -166,5 +166,6 @@
             return None, end
         if end and end != end_html:
             return translate('OpenLP.FormattingTagForm',
-                             'End tag %s does not match end tag for start tag %s') % (end, start_html), None
+                             'End tag %(end)s does not match end tag for start tag %(start)s') % \
+                {'end': end, 'start': start_html}, None
         return None, None

=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py	2015-10-16 16:30:13 +0000
+++ openlp/core/ui/mainwindow.py	2015-12-17 21:47:02 +0000
@@ -566,7 +566,7 @@
         self.application.set_busy_cursor()
         # Simple message boxes
         Registry().register_function('theme_update_global', self.default_theme_changed)
-        QtCore.QObject.connect(self, QtCore.SIGNAL('openlp_version_check'),  self.version_notice)
+        QtCore.QObject.connect(self, QtCore.SIGNAL('openlp_version_check'), self.version_notice)
         Registry().register_function('config_screen_changed', self.screen_changed)
         Registry().register_function('bootstrap_post_set_up', self.bootstrap_post_set_up)
         # Reset the cursor
@@ -1089,13 +1089,13 @@
                 event.ignore()
         else:
             if Settings().value('advanced/enable exit confirmation'):
-                ret = QtGui.QMessageBox.question(self, translate('OpenLP.MainWindow', 'Close OpenLP'),
-                                                 translate('OpenLP.MainWindow', 'Are you sure you want to close '
-                                                                                'OpenLP?'),
-                                                 QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes |
-                                                                                   QtGui.QMessageBox.No),
-                                                 QtGui.QMessageBox.Yes)
-                if ret == QtGui.QMessageBox.Yes:
+                msg_box = QtGui.QMessageBox(QtGui.QMessageBox.Question, translate('OpenLP.MainWindow', 'Exit OpenLP'),
+                                            translate('OpenLP.MainWindow', 'Are you sure you want to exit OpenLP?'),
+                                            QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Close |
+                                                                              QtGui.QMessageBox.Cancel), self)
+                msg_box.setButtonText(QtGui.QMessageBox.Close, translate('OpenLP.MainWindow', '&Exit OpenLP'))
+                msg_box.setDefaultButton(QtGui.QMessageBox.Close)
+                if msg_box.exec() == QtGui.QMessageBox.Close:
                     self.clean_up()
                     event.accept()
                 else:

=== modified file 'openlp/core/ui/media/mediacontroller.py'
--- openlp/core/ui/media/mediacontroller.py	2015-12-10 17:26:08 +0000
+++ openlp/core/ui/media/mediacontroller.py	2015-12-17 21:47:02 +0000
@@ -476,9 +476,9 @@
             controller.media_info.media_type = MediaType.CD
         else:
             controller.media_info.media_type = MediaType.DVD
-        controller.media_info.start_time = start/1000
-        controller.media_info.end_time = end/1000
-        controller.media_info.length = (end - start)/1000
+        controller.media_info.start_time = start / 1000
+        controller.media_info.end_time = end / 1000
+        controller.media_info.length = (end - start) / 1000
         controller.media_info.title_track = title
         controller.media_info.audio_track = audio_track
         controller.media_info.subtitle_track = subtitle_track

=== modified file 'openlp/core/ui/projector/manager.py'
--- openlp/core/ui/projector/manager.py	2015-10-12 12:59:17 +0000
+++ openlp/core/ui/projector/manager.py	2015-12-17 21:47:02 +0000
@@ -45,18 +45,18 @@
 from openlp.core.ui.projector.sourceselectform import SourceSelectTabs, SourceSelectSingle
 
 # Dict for matching projector status to display icon
-STATUS_ICONS = {S_NOT_CONNECTED:  ':/projector/projector_item_disconnect.png',
-                S_CONNECTING:  ':/projector/projector_item_connect.png',
-                S_CONNECTED:  ':/projector/projector_off.png',
-                S_OFF:  ':/projector/projector_off.png',
-                S_INITIALIZE:  ':/projector/projector_off.png',
-                S_STANDBY:  ':/projector/projector_off.png',
-                S_WARMUP:  ':/projector/projector_warmup.png',
-                S_ON:  ':/projector/projector_on.png',
-                S_COOLDOWN:  ':/projector/projector_cooldown.png',
-                E_ERROR:  ':/projector/projector_error.png',
-                E_NETWORK:  ':/projector/projector_not_connected_error.png',
-                E_AUTHENTICATION:  ':/projector/projector_not_connected_error.png',
+STATUS_ICONS = {S_NOT_CONNECTED: ':/projector/projector_item_disconnect.png',
+                S_CONNECTING: ':/projector/projector_item_connect.png',
+                S_CONNECTED: ':/projector/projector_off.png',
+                S_OFF: ':/projector/projector_off.png',
+                S_INITIALIZE: ':/projector/projector_off.png',
+                S_STANDBY: ':/projector/projector_off.png',
+                S_WARMUP: ':/projector/projector_warmup.png',
+                S_ON: ':/projector/projector_on.png',
+                S_COOLDOWN: ':/projector/projector_cooldown.png',
+                E_ERROR: ':/projector/projector_error.png',
+                E_NETWORK: ':/projector/projector_not_connected_error.png',
+                E_AUTHENTICATION: ':/projector/projector_not_connected_error.png',
                 E_UNKNOWN_SOCKET_ERROR: ':/projector/projector_not_connected_error.png',
                 E_NOT_CONNECTED: ':/projector/projector_not_connected_error.png'
                 }

=== modified file 'openlp/core/ui/projector/sourceselectform.py'
--- openlp/core/ui/projector/sourceselectform.py	2015-09-08 19:13:59 +0000
+++ openlp/core/ui/projector/sourceselectform.py	2015-12-17 21:47:02 +0000
@@ -443,7 +443,7 @@
                                                QtGui.QDialogButtonBox.Cancel)
         self.button_box.clicked.connect(self.button_clicked)
         self.layout.addWidget(self.button_box)
-        self.setMinimumHeight(key_count*25)
+        self.setMinimumHeight(key_count * 25)
         set_button_tooltip(self.button_box)
         selected = super(SourceSelectSingle, self).exec_()
         return selected

=== modified file 'openlp/core/ui/wizard.py'
--- openlp/core/ui/wizard.py	2015-01-18 13:39:21 +0000
+++ openlp/core/ui/wizard.py	2015-12-17 21:47:02 +0000
@@ -277,7 +277,7 @@
         :param filters: The file extension filters. It should contain the file description
             as well as the file extension. For example::
 
-                'OpenLP 2.0 Databases (*.sqlite)'
+                'OpenLP 2 Databases (*.sqlite)'
         """
         if filters:
             filters += ';;'

=== modified file 'openlp/plugins/bibles/forms/bibleupgradeform.py'
--- openlp/plugins/bibles/forms/bibleupgradeform.py	2015-01-18 13:39:21 +0000
+++ openlp/plugins/bibles/forms/bibleupgradeform.py	2015-12-17 21:47:02 +0000
@@ -547,9 +547,9 @@
             if self.includeWebBible:
                 self.progress_label.setText(
                     translate('BiblesPlugin.UpgradeWizardForm',
-                              'Upgrading Bible(s): %s successful%s\nPlease note that verses from Web Bibles will be '
-                              'downloaded on demand and so an Internet connection is required.') %
-                    (successful_import, failed_import_text))
+                              'Upgrading Bible(s): %(success)d successful%(failed_text)s\nPlease note that verses '
+                              'from Web Bibles will be downloaded on demand and so an Internet connection is required.')
+                    % {'success': successful_import, 'failed_text': failed_import_text})
             else:
                 self.progress_label.setText(
                     translate('BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible(s): %s successful%s') % (

=== modified file 'openlp/plugins/presentations/lib/pptviewcontroller.py'
--- openlp/plugins/presentations/lib/pptviewcontroller.py	2015-01-18 13:39:21 +0000
+++ openlp/plugins/presentations/lib/pptviewcontroller.py	2015-12-17 21:47:02 +0000
@@ -184,13 +184,13 @@
                     # check if it is a slide
                     match = re.search("slides/slide(.+)\.xml", zip_info.filename)
                     if match:
-                        index = int(match.group(1))-1
+                        index = int(match.group(1)) - 1
                         node_type = 'ctrTitle'
                         list_to_add = titles
                     # or a note
                     match = re.search("notesSlides/notesSlide(.+)\.xml", zip_info.filename)
                     if match:
-                        index = int(match.group(1))-1
+                        index = int(match.group(1)) - 1
                         node_type = 'body'
                         list_to_add = notes
                     # if it is one of our files, index shouldn't be -1

=== modified file 'openlp/plugins/songs/forms/editsongform.py'
--- openlp/plugins/songs/forms/editsongform.py	2015-10-16 16:58:22 +0000
+++ openlp/plugins/songs/forms/editsongform.py	2015-12-17 21:47:02 +0000
@@ -280,9 +280,9 @@
             return True
         if len(tags) % 2 != 0:
             return False
-        for i in range(len(tags)-1):
-            if tags[i+1] == "{/" + tags[i][1:]:
-                del tags[i:i+2]
+        for i in range(len(tags) - 1):
+            if tags[i + 1] == "{/" + tags[i][1:]:
+                del tags[i:i + 2]
                 return self._validate_tags(tags, False)
         return False
 

=== modified file 'openlp/plugins/songs/lib/importer.py'
--- openlp/plugins/songs/lib/importer.py	2015-01-18 13:39:21 +0000
+++ openlp/plugins/songs/lib/importer.py	2015-12-17 21:47:02 +0000
@@ -187,14 +187,14 @@
             'name': 'OpenLyrics',
             'prefix': 'openLyrics',
             'filter': '%s (*.xml)' % translate('SongsPlugin.ImportWizardForm', 'OpenLyrics Files'),
-            'comboBoxText': translate('SongsPlugin.ImportWizardForm', 'OpenLyrics or OpenLP 2.0 Exported Song')
+            'comboBoxText': translate('SongsPlugin.ImportWizardForm', 'OpenLyrics or OpenLP 2 Exported Song')
         },
         OpenLP2: {
             'class': OpenLPSongImport,
             'name': UiStrings().OLPV2,
             'prefix': 'openLP2',
             'selectMode': SongFormatSelect.SingleFile,
-            'filter': '%s (*.sqlite)' % (translate('SongsPlugin.ImportWizardForm', 'OpenLP 2.0 Databases'))
+            'filter': '%s (*.sqlite)' % (translate('SongsPlugin.ImportWizardForm', 'OpenLP 2 Databases'))
         },
         Generic: {
             'name': translate('SongsPlugin.ImportWizardForm', 'Generic Document/Presentation'),

=== modified file 'openlp/plugins/songs/lib/importers/easyworship.py'
--- openlp/plugins/songs/lib/importers/easyworship.py	2015-01-18 13:39:21 +0000
+++ openlp/plugins/songs/lib/importers/easyworship.py	2015-12-17 21:47:02 +0000
@@ -123,7 +123,7 @@
             log.debug('Given ews file is of unknown version.')
             return
         entry_count = self.get_i32(file_pos)
-        entry_length = self.get_i16(file_pos+4)
+        entry_length = self.get_i16(file_pos + 4)
         file_pos += 6
         self.import_wizard.progress_bar.setMaximum(entry_count)
         # Loop over songs

=== modified file 'openlp/plugins/songs/lib/importers/openlp.py'
--- openlp/plugins/songs/lib/importers/openlp.py	2015-01-18 13:39:21 +0000
+++ openlp/plugins/songs/lib/importers/openlp.py	2015-12-17 21:47:02 +0000
@@ -94,7 +94,7 @@
         # Check the file type
         if not self.import_source.endswith('.sqlite'):
             self.log_error(self.import_source, translate('SongsPlugin.OpenLPSongImport',
-                                                         'Not a valid OpenLP 2.0 song database.'))
+                                                         'Not a valid OpenLP 2 song database.'))
             return
         self.import_source = 'sqlite:///%s' % self.import_source
         # Load the db file

=== modified file 'openlp/plugins/songs/lib/importers/opensong.py'
--- openlp/plugins/songs/lib/importers/opensong.py	2015-01-18 13:39:21 +0000
+++ openlp/plugins/songs/lib/importers/opensong.py	2015-12-17 21:47:02 +0000
@@ -171,12 +171,12 @@
         topics = set(self.topics)
         if 'theme' in fields:
             theme = str(root.theme)
-            subthemes = theme[theme.find(':')+1:].split('/')
+            subthemes = theme[theme.find(':') + 1:].split('/')
             for topic in subthemes:
                 topics.add(topic.strip())
         if 'alttheme' in fields:
             theme = str(root.alttheme)
-            subthemes = theme[theme.find(':')+1:].split('/')
+            subthemes = theme[theme.find(':') + 1:].split('/')
             for topic in subthemes:
                 topics.add(topic.strip())
         self.topics = list(topics)

=== modified file 'openlp/plugins/songs/lib/importers/wordsofworship.py'
--- openlp/plugins/songs/lib/importers/wordsofworship.py	2015-01-18 13:39:21 +0000
+++ openlp/plugins/songs/lib/importers/wordsofworship.py	2015-12-17 21:47:02 +0000
@@ -108,8 +108,8 @@
                 if song_data.read(19).decode() != 'WoW File\nSong Words':
                     self.log_error(source,
                                    str(translate('SongsPlugin.WordsofWorshipSongImport',
-                                                 'Invalid Words of Worship song file. Missing "WoW File\\nSong '
-                                                 'Words" header.')))
+                                                 'Invalid Words of Worship song file. Missing "%s" header.'
+                                                 % 'WoW File\\nSong Words')))
                     continue
                 # Seek to byte which stores number of blocks in the song
                 song_data.seek(56)
@@ -118,8 +118,8 @@
                 if song_data.read(16).decode() != 'CSongDoc::CBlock':
                     self.log_error(source,
                                    str(translate('SongsPlugin.WordsofWorshipSongImport',
-                                                 'Invalid Words of Worship song file. Missing "CSongDoc::CBlock" '
-                                                 'string.')))
+                                                 'Invalid Words of Worship song file. Missing "%s" '
+                                                 'string.' % 'CSongDoc::CBlock')))
                     continue
                 # Seek to the beginning of the first block
                 song_data.seek(82)

=== modified file 'scripts/check_dependencies.py'
--- scripts/check_dependencies.py	2015-04-03 21:43:36 +0000
+++ scripts/check_dependencies.py	2015-12-17 21:47:02 +0000
@@ -93,7 +93,7 @@
     ('mysql.connector', '(MySQL support)', True),
     ('psycopg2', '(PostgreSQL support)', True),
     ('nose', '(testing framework)', True),
-    ('mock',  '(testing module)', sys.version_info[1] < 3),
+    ('mock', '(testing module)', sys.version_info[1] < 3),
     ('jenkins', '(access jenkins api - package name: jenkins-webapi)', True),
 ]
 

=== modified file 'scripts/lp-merge.py'
--- scripts/lp-merge.py	2015-10-12 12:59:53 +0000
+++ scripts/lp-merge.py	2015-12-17 21:47:02 +0000
@@ -96,7 +96,7 @@
 # <div class="context-publication"><h1>Merge ... into...
 div_branches = soup.find('div', class_='context-publication')
 branches = div_branches.h1.contents[0]
-target_branch = '+branch/' + branches[(branches.find(' into lp:')+9):]
+target_branch = '+branch/' + branches[(branches.find(' into lp:') + 9):]
 
 # Check that we are in the right branch
 bzr_info_output = subprocess.check_output(['bzr', 'info'])

=== modified file 'setup.cfg'
--- setup.cfg	2014-05-21 19:57:06 +0000
+++ setup.cfg	2015-12-17 21:47:02 +0000
@@ -1,3 +1,4 @@
 [pep8]
 exclude=resources.py,vlc.py
 max-line-length = 120
+ignore = E402

=== modified file 'tests/functional/openlp_core/test_init.py'
--- tests/functional/openlp_core/test_init.py	2015-10-16 16:17:38 +0000
+++ tests/functional/openlp_core/test_init.py	2015-12-17 21:47:02 +0000
@@ -43,7 +43,7 @@
         self.assertEquals(args.loglevel, 'warning', 'The log level should be set to warning')
         self.assertFalse(args.no_error_form, 'The no_error_form should be set to False')
         self.assertFalse(args.portable, 'The portable flag should be set to false')
-        self.assertEquals(args.style,  None, 'There are no style flags to be processed')
+        self.assertEquals(args.style, None, 'There are no style flags to be processed')
         self.assertEquals(args.rargs, [], 'The service file should be blank')
 
     def parse_options_debug_test(self):
@@ -60,7 +60,7 @@
         self.assertEquals(args.loglevel, ' debug', 'The log level should be set to debug')
         self.assertFalse(args.no_error_form, 'The no_error_form should be set to False')
         self.assertFalse(args.portable, 'The portable flag should be set to false')
-        self.assertEquals(args.style,  None, 'There are no style flags to be processed')
+        self.assertEquals(args.style, None, 'There are no style flags to be processed')
         self.assertEquals(args.rargs, [], 'The service file should be blank')
 
     def parse_options_debug_and_portable_test(self):
@@ -77,7 +77,7 @@
         self.assertEquals(args.loglevel, 'warning', 'The log level should be set to warning')
         self.assertFalse(args.no_error_form, 'The no_error_form should be set to False')
         self.assertTrue(args.portable, 'The portable flag should be set to true')
-        self.assertEquals(args.style,  None, 'There are no style flags to be processed')
+        self.assertEquals(args.style, None, 'There are no style flags to be processed')
         self.assertEquals(args.rargs, [], 'The service file should be blank')
 
     def parse_options_all_no_file_test(self):
@@ -94,7 +94,7 @@
         self.assertEquals(args.loglevel, ' debug', 'The log level should be set to debug')
         self.assertFalse(args.no_error_form, 'The no_error_form should be set to False')
         self.assertFalse(args.portable, 'The portable flag should be set to false')
-        self.assertEquals(args.style,  None, 'There are no style flags to be processed')
+        self.assertEquals(args.style, None, 'There are no style flags to be processed')
         self.assertEquals(args.rargs, [], 'The service file should be blank')
 
     def parse_options_file_test(self):
@@ -111,7 +111,7 @@
         self.assertEquals(args.loglevel, 'warning', 'The log level should be set to warning')
         self.assertFalse(args.no_error_form, 'The no_error_form should be set to False')
         self.assertFalse(args.portable, 'The portable flag should be set to false')
-        self.assertEquals(args.style,  None, 'There are no style flags to be processed')
+        self.assertEquals(args.style, None, 'There are no style flags to be processed')
         self.assertEquals(args.rargs, 'dummy_temp', 'The service file should not be blank')
 
     def parse_options_file_and_debug_test(self):
@@ -128,7 +128,7 @@
         self.assertEquals(args.loglevel, ' debug', 'The log level should be set to debug')
         self.assertFalse(args.no_error_form, 'The no_error_form should be set to False')
         self.assertFalse(args.portable, 'The portable flag should be set to false')
-        self.assertEquals(args.style,  None, 'There are no style flags to be processed')
+        self.assertEquals(args.style, None, 'There are no style flags to be processed')
         self.assertEquals(args.rargs, 'dummy_temp', 'The service file should not be blank')
 
     def parse_options_two_files_test(self):

=== modified file 'tests/functional/openlp_plugins/songs/test_ewimport.py'
--- tests/functional/openlp_plugins/songs/test_ewimport.py	2015-11-25 21:47:56 +0000
+++ tests/functional/openlp_plugins/songs/test_ewimport.py	2015-12-17 21:47:02 +0000
@@ -119,7 +119,7 @@
 TEST_DATA_ENCODING = 'cp1252'
 CODE_PAGE_MAPPINGS = [
     (852, 'cp1250'), (737, 'cp1253'), (775, 'cp1257'), (855, 'cp1251'), (857, 'cp1254'),
-    (866,  'cp1251'), (869, 'cp1253'), (862, 'cp1255'), (874, 'cp874')]
+    (866, 'cp1251'), (869, 'cp1253'), (862, 'cp1255'), (874, 'cp874')]
 TEST_FIELD_DESCS = [
     TestFieldDesc('Title', FieldType.String, 50),
     TestFieldDesc('Text Percentage Bottom', FieldType.Int16, 2), TestFieldDesc('RecID', FieldType.Int32, 4),

=== modified file 'tests/functional/openlp_plugins/songs/test_mediaitem.py'
--- tests/functional/openlp_plugins/songs/test_mediaitem.py	2015-01-18 13:39:21 +0000
+++ tests/functional/openlp_plugins/songs/test_mediaitem.py	2015-12-17 21:47:02 +0000
@@ -119,7 +119,7 @@
 
         # THEN: I get the following Array returned
         self.assertEqual(service_item.raw_footer, ['My Song', 'Words: another author', 'Music: my author',
-                                                   'Translation: translator',  'My copyright'],
+                                                   'Translation: translator', 'My copyright'],
                          'The array should be returned correctly with a song, two authors and copyright')
         self.assertEqual(author_list, ['another author', 'my author', 'translator'],
                          'The author list should be returned correctly with two authors')

=== modified file 'tests/functional/openlp_plugins/songs/test_songselect.py'
--- tests/functional/openlp_plugins/songs/test_songselect.py	2015-06-24 20:26:52 +0000
+++ tests/functional/openlp_plugins/songs/test_songselect.py	2015-12-17 21:47:02 +0000
@@ -82,7 +82,7 @@
         self.assertFalse(result, 'The login method should have returned False')
 
     @patch('openlp.plugins.songs.lib.songselect.build_opener')
-    def login_except_test(self,  mocked_build_opener):
+    def login_except_test(self, mocked_build_opener):
         """
         Test that when logging in to SongSelect fails, the login method raises URLError
         """

=== modified file 'tests/functional/openlp_plugins/songs/test_wordsofworshipimport.py'
--- tests/functional/openlp_plugins/songs/test_wordsofworshipimport.py	2015-01-18 13:39:21 +0000
+++ tests/functional/openlp_plugins/songs/test_wordsofworshipimport.py	2015-12-17 21:47:02 +0000
@@ -47,3 +47,6 @@
                          self.load_external_result_data(os.path.join(TEST_PATH, 'Amazing Grace (6 Verses).json')))
         self.file_import([os.path.join(TEST_PATH, 'When morning gilds the skies.wsg')],
                          self.load_external_result_data(os.path.join(TEST_PATH, 'When morning gilds the skies.json')))
+        self.file_import([os.path.join(TEST_PATH, 'Holy Holy Holy Lord God Almighty.wow-song')],
+                         self.load_external_result_data(os.path.join(TEST_PATH,
+                                                                     'Holy Holy Holy Lord God Almighty.json')))

=== added file 'tests/resources/wordsofworshipsongs/Holy Holy Holy Lord God Almighty.json'
--- tests/resources/wordsofworshipsongs/Holy Holy Holy Lord God Almighty.json	1970-01-01 00:00:00 +0000
+++ tests/resources/wordsofworshipsongs/Holy Holy Holy Lord God Almighty.json	2015-12-17 21:47:02 +0000
@@ -0,0 +1,25 @@
+{
+    "authors": [
+        "Words: Reginald Heber (1783-1826). Music: John B. Dykes (1823-1876)"
+    ],
+    "title": "Holy Holy Holy Lord God Almighty",
+    "verse_order_list": [],
+    "verses": [
+        [
+            "Holy, holy, holy, Lord God Almighty\nEarly in the morning\nOur song shall rise to Thee:\nHoly, holy, holy, merciful and mighty,\nGod in three Persons, blessed Trinity!",
+            "V"
+        ],
+        [
+            "Holy, holy, holy! all the saints adore Thee,\nCasting down their golden crowns\nAround the glassy sea;\nCherubim and seraphim falling down before Thee,\nWho were and are and evermore shall be.",
+            "V"
+        ],
+        [
+            "Holy, holy, holy! though the darkness hide Thee,\nThough the eye of sinful man\nThy glory may not see;\nOnly Thou art holy, there is none beside Thee,\nPerfect in power, in love and purity.",
+            "V"
+        ],
+        [
+            "Holy, holy, holy, Lord God Almighty!\nAll Thy works shall praise Thy name\nIn earth, and sky, and sea;\nHoly, holy, holy, merciful and mighty\nGod in three Persons, blessed Trinity!",
+            "V"
+        ]
+    ]
+}

=== added file 'tests/resources/wordsofworshipsongs/Holy Holy Holy Lord God Almighty.wow-song'
Binary files tests/resources/wordsofworshipsongs/Holy Holy Holy Lord God Almighty.wow-song	1970-01-01 00:00:00 +0000 and tests/resources/wordsofworshipsongs/Holy Holy Holy Lord God Almighty.wow-song	2015-12-17 21:47:02 +0000 differ

Follow ups