Fix traceback when searching for book that doesn't exists in second bible. Fixes bug 1553863. Set progress bar steps to number of chapters in zefania import. Fix song tag detection. Fixes bug 1549549. Fix a method call with too many parentheses, which fixes getting bible books from crosswalk. Fix bug that prevents song book entries to be imported.

This commit is contained in:
Tomas Groth 2016-04-21 21:49:22 +02:00
parent 7b1a61a0e6
commit 2c640389f1
7 changed files with 37 additions and 8 deletions

View File

@ -504,7 +504,7 @@ class CWExtract(RegistryProperties):
soup = get_soup_for_bible_ref(chapter_url) soup = get_soup_for_bible_ref(chapter_url)
if not soup: if not soup:
return None return None
content = soup.find_all(('h4', {'class': 'small-header'})) content = soup.find_all('h4', {'class': 'small-header'})
if not content: if not content:
log.error('No books found in the Crosswalk response.') log.error('No books found in the Crosswalk response.')
send_error_message('parse') send_error_message('parse')

View File

@ -764,6 +764,9 @@ class BibleMediaItem(MediaManagerItem):
except IndexError: except IndexError:
log.exception('The second_search_results does not have as many verses as the search_results.') log.exception('The second_search_results does not have as many verses as the search_results.')
break break
except TypeError:
log.exception('The second_search_results does not have this book.')
break
bible_text = '%s %d%s%d (%s, %s)' % (book, verse.chapter, verse_separator, verse.verse, version, bible_text = '%s %d%s%d (%s, %s)' % (book, verse.chapter, verse_separator, verse.verse, version,
second_version) second_version)
else: else:

View File

@ -70,7 +70,8 @@ class ZefaniaBible(BibleDB):
log.error('Importing books from "%s" failed' % self.filename) log.error('Importing books from "%s" failed' % self.filename)
return False return False
self.save_meta('language_id', language_id) self.save_meta('language_id', language_id)
num_books = int(zefania_bible_tree.xpath("count(//BIBLEBOOK)")) num_books = int(zefania_bible_tree.xpath('count(//BIBLEBOOK)'))
self.wizard.progress_bar.setMaximum(int(zefania_bible_tree.xpath('count(//CHAPTER)')))
# Strip tags we don't use - keep content # Strip tags we don't use - keep content
etree.strip_tags(zefania_bible_tree, ('STYLE', 'GRAM', 'NOTE', 'SUP', 'XREF')) etree.strip_tags(zefania_bible_tree, ('STYLE', 'GRAM', 'NOTE', 'SUP', 'XREF'))
# Strip tags we don't use - remove content # Strip tags we don't use - remove content

View File

@ -256,6 +256,7 @@ class VerseType(object):
for num, translation in enumerate(VerseType.translated_names): for num, translation in enumerate(VerseType.translated_names):
if verse_name == translation.lower(): if verse_name == translation.lower():
return num return num
return None
@staticmethod @staticmethod
def from_loose_input(verse_name, default=Other): def from_loose_input(verse_name, default=Other):
@ -271,7 +272,7 @@ class VerseType(object):
if verse_index is None: if verse_index is None:
verse_index = VerseType.from_string(verse_name, default) verse_index = VerseType.from_string(verse_name, default)
elif len(verse_name) == 1: elif len(verse_name) == 1:
verse_index = VerseType.from_translated_tag(verse_name, default) verse_index = VerseType.from_translated_tag(verse_name, None)
if verse_index is None: if verse_index is None:
verse_index = VerseType.from_tag(verse_name, default) verse_index = VerseType.from_tag(verse_name, default)
else: else:

View File

@ -371,7 +371,7 @@ class SongImport(QtCore.QObject):
song_book = self.manager.get_object_filtered(Book, Book.name == self.song_book_name) song_book = self.manager.get_object_filtered(Book, Book.name == self.song_book_name)
if song_book is None: if song_book is None:
song_book = Book.populate(name=self.song_book_name, publisher=self.song_book_pub) song_book = Book.populate(name=self.song_book_name, publisher=self.song_book_pub)
song.book = song_book song.add_songbook_entry(song_book, song.song_number)
for topic_text in self.topics: for topic_text in self.topics:
if not topic_text: if not topic_text:
continue continue

View File

@ -26,12 +26,12 @@ import sys
from PyQt5 import QtWidgets from PyQt5 import QtWidgets
if sys.version_info[1] >= 3: if sys.version_info[1] >= 3:
from unittest.mock import ANY, MagicMock, patch, mock_open, call from unittest.mock import ANY, MagicMock, patch, mock_open, call, PropertyMock
else: else:
from mock import ANY, MagicMock, patch, mock_open, call from mock import ANY, MagicMock, patch, mock_open, call, PropertyMock
# Only one QApplication can be created. Use QtWidgets.QApplication.instance() when you need to "create" a QApplication. # Only one QApplication can be created. Use QtWidgets.QApplication.instance() when you need to "create" a QApplication.
application = QtWidgets.QApplication([]) application = QtWidgets.QApplication([])
application.setApplicationName('OpenLP') application.setApplicationName('OpenLP')
__all__ = ['ANY', 'MagicMock', 'patch', 'mock_open', 'call', 'application'] __all__ = ['ANY', 'MagicMock', 'patch', 'mock_open', 'call', 'application', 'PropertyMock']

View File

@ -26,7 +26,7 @@ from unittest import TestCase
from openlp.plugins.songs.lib import VerseType, clean_string, clean_title, strip_rtf from openlp.plugins.songs.lib import VerseType, clean_string, clean_title, strip_rtf
from openlp.plugins.songs.lib.songcompare import songs_probably_equal, _remove_typos, _op_length from openlp.plugins.songs.lib.songcompare import songs_probably_equal, _remove_typos, _op_length
from tests.functional import patch, MagicMock from tests.functional import patch, MagicMock, PropertyMock
class TestLib(TestCase): class TestLib(TestCase):
@ -477,3 +477,27 @@ class TestVerseType(TestCase):
# THEN: The result should be None # THEN: The result should be None
self.assertIsNone(result, 'The result should be None, but was "%s"' % result) self.assertIsNone(result, 'The result should be None, but was "%s"' % result)
@patch('openlp.plugins.songs.lib.VerseType.translated_tags', new_callable=PropertyMock, return_value=['x'])
def from_loose_input_with_invalid_input_test(self, mocked_translated_tags):
"""
Test that the from_loose_input() method returns a sane default when passed an invalid tag and None as default.
"""
# GIVEN: A mocked VerseType.translated_tags
# WHEN: We run the from_loose_input() method with an invalid verse type, we get the specified default back
result = VerseType.from_loose_input('m', None)
# THEN: The result should be None
self.assertIsNone(result, 'The result should be None, but was "%s"' % result)
@patch('openlp.plugins.songs.lib.VerseType.translated_tags', new_callable=PropertyMock, return_value=['x'])
def from_loose_input_with_valid_input_test(self, mocked_translated_tags):
"""
Test that the from_loose_input() method returns valid output on valid input.
"""
# GIVEN: A mocked VerseType.translated_tags
# WHEN: We run the from_loose_input() method with a valid verse type, we get the expected VerseType back
result = VerseType.from_loose_input('v')
# THEN: The result should be a Verse
self.assertEqual(result, VerseType.Verse, 'The result should be a verse, but was "%s"' % result)