Fix bible traceback for non existant book

Prevent infine loop on invalid logic page split
Use existing plugin states when re-running FTW

bzr-revno: 2448
This commit is contained in:
Tim Bentley 2014-11-25 21:46:11 +00:00
commit d267144ea4
6 changed files with 88 additions and 6 deletions

View File

@ -250,7 +250,13 @@ class Renderer(OpenLPMixin, RegistryMixin, RegistryProperties):
# Remove two or more option slide breaks next to each other (causing infinite loop). # Remove two or more option slide breaks next to each other (causing infinite loop).
while '\n[---]\n[---]\n' in text: while '\n[---]\n[---]\n' in text:
text = text.replace('\n[---]\n[---]\n', '\n[---]\n') text = text.replace('\n[---]\n[---]\n', '\n[---]\n')
while True: while ' [---]' in text:
text = text.replace(' [---]', '[---]')
while '[---] ' in text:
text = text.replace('[---] ', '[---]')
count = 0
# only loop 5 times as there will never be more than 5 incorrect logical splits on a single slide.
while True and count < 5:
slides = text.split('\n[---]\n', 2) slides = text.split('\n[---]\n', 2)
# If there are (at least) two occurrences of [---] we use the first two slides (and neglect the last # If there are (at least) two occurrences of [---] we use the first two slides (and neglect the last
# for now). # for now).
@ -296,6 +302,7 @@ class Renderer(OpenLPMixin, RegistryMixin, RegistryProperties):
lines = text.strip('\n').split('\n') lines = text.strip('\n').split('\n')
pages.extend(self._paginate_slide(lines, line_end)) pages.extend(self._paginate_slide(lines, line_end))
break break
count =+ 1
else: else:
# Clean up line endings. # Clean up line endings.
pages = self._paginate_slide(text.split('\n'), line_end) pages = self._paginate_slide(text.split('\n'), line_end)

View File

@ -95,6 +95,17 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties):
""" """
self.application.process_events() self.application.process_events()
if self.currentId() == FirstTimePage.Plugins: if self.currentId() == FirstTimePage.Plugins:
if self.has_run_wizard:
self.songs_check_box.setChecked(self.plugin_manager.get_plugin_by_name('songs').is_active())
self.bible_check_box.setChecked(self.plugin_manager.get_plugin_by_name('bibles').is_active())
self.presentation_check_box.setChecked(self.plugin_manager.get_plugin_by_name(
'presentations').is_active())
self.image_check_box.setChecked(self.plugin_manager.get_plugin_by_name('images').is_active())
self.media_check_box.setChecked(self.plugin_manager.get_plugin_by_name('media').is_active())
self.remote_check_box.setChecked(self.plugin_manager.get_plugin_by_name('remotes').is_active())
self.custom_check_box.setChecked(self.plugin_manager.get_plugin_by_name('custom').is_active())
self.song_usage_check_box.setChecked(self.plugin_manager.get_plugin_by_name('songusage').is_active())
self.alert_check_box.setChecked(self.plugin_manager.get_plugin_by_name('alerts').is_active())
if not self.web_access: if not self.web_access:
return FirstTimePage.NoInternet return FirstTimePage.NoInternet
else: else:

View File

@ -330,7 +330,10 @@ def parse_reference(reference, bible, language_selection, book_ref_id=False):
if not book_ref_id: if not book_ref_id:
book_ref_id = bible.get_book_ref_id_by_localised_name(book, language_selection) book_ref_id = bible.get_book_ref_id_by_localised_name(book, language_selection)
elif not bible.get_book_by_book_ref_id(book_ref_id): elif not bible.get_book_by_book_ref_id(book_ref_id):
book_ref_id = False return False
# We have not found the book so do not continue
if not book_ref_id:
return False
ranges = match.group('ranges') ranges = match.group('ranges')
range_list = get_reference_match('range_separator').split(ranges) range_list = get_reference_match('range_separator').split(ranges)
ref_list = [] ref_list = []

View File

@ -99,7 +99,7 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog, RegistryPrope
report_file_name = os.path.join(path, file_name) report_file_name = os.path.join(path, file_name)
file_handle = None file_handle = None
try: try:
file_handle = open(report_file_name, 'w') file_handle = open(report_file_name, 'wb')
for instance in usage: for instance in usage:
record = '\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",' \ record = '\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",' \
'\"%s\",\"%s\"\n' % \ '\"%s\",\"%s\"\n' % \

View File

@ -34,7 +34,7 @@ from unittest import TestCase
from PyQt4 import QtCore from PyQt4 import QtCore
from openlp.core.common import Registry from openlp.core.common import Registry
from openlp.core.lib import Renderer, ScreenList from openlp.core.lib import Renderer, ScreenList, ServiceItem
from tests.interfaces import MagicMock from tests.interfaces import MagicMock
@ -88,7 +88,7 @@ class TestRenderer(TestCase):
expected_tuple = ('{st}{r}Text text text{/r}{/st}', '{st}{r}', expected_tuple = ('{st}{r}Text text text{/r}{/st}', '{st}{r}',
'<strong><span style="-webkit-text-fill-color:red">') '<strong><span style="-webkit-text-fill-color:red">')
# WHEN: # WHEN: The renderer converts the start tags
result = renderer._get_start_tags(given_raw_text) result = renderer._get_start_tags(given_raw_text)
# THEN: Check if the correct tuple is returned. # THEN: Check if the correct tuple is returned.
@ -104,8 +104,59 @@ class TestRenderer(TestCase):
given_line = 'beginning asdf \n end asdf' given_line = 'beginning asdf \n end asdf'
expected_words = ['beginning', 'asdf', 'end', 'asdf'] expected_words = ['beginning', 'asdf', 'end', 'asdf']
# WHEN: Split the line # WHEN: Split the line based on word split rules
result_words = renderer._words_split(given_line) result_words = renderer._words_split(given_line)
# THEN: The word lists should be the same. # THEN: The word lists should be the same.
self.assertListEqual(result_words, expected_words) self.assertListEqual(result_words, expected_words)
def format_slide_logical_split_test(self):
"""
Test that a line with text and a logic break does not break the renderer just returns the input
"""
# GIVEN: A line of with a space text and the logical split
renderer = Renderer()
renderer.empty_height = 25
given_line = 'a\n[---]\nb'
expected_words = ['a<br>[---]<br>b']
service_item = ServiceItem(None)
# WHEN: Split the line based on word split rules
result_words = renderer.format_slide(given_line, service_item)
# THEN: The word lists should be the same.
self.assertListEqual(result_words, expected_words)
def format_slide_blank_before_split_test(self):
"""
Test that a line with blanks before the logical split at handled
"""
# GIVEN: A line of with a space before the logical split
renderer = Renderer()
renderer.empty_height = 25
given_line = '\n [---]\n'
expected_words = ['<br> [---]']
service_item = ServiceItem(None)
# WHEN: Split the line based on word split rules
result_words = renderer.format_slide(given_line, service_item)
# THEN: The blanks have been removed.
self.assertListEqual(result_words, expected_words)
def format_slide_blank_after_split_test(self):
"""
Test that a line with blanks before the logical split at handled
"""
# GIVEN: A line of with a space after the logical split
renderer = Renderer()
renderer.empty_height = 25
given_line = '\n[---] \n'
expected_words = ['<br>[---] ']
service_item = ServiceItem(None)
# WHEN: Split the line based on word split rules
result_words = renderer.format_slide(given_line, service_item)
# THEN: The blanks have been removed.
self.assertListEqual(result_words, expected_words)

View File

@ -105,3 +105,13 @@ class TestBibleManager(TestCase, TestMixin):
# THEN a verse array should be returned # THEN a verse array should be returned
self.assertEqual([(54, 1, 1, -1), (54, 2, 1, 1)], results, self.assertEqual([(54, 1, 1, -1), (54, 2, 1, 1)], results,
"The bible verses should match the expected results") "The bible verses should match the expected results")
def parse_reference_four_test(self):
"""
Test the parse_reference method with non existence book
"""
# GIVEN given a bible in the bible manager
# WHEN asking to parse the bible reference
results = parse_reference('Raoul 1', self.manager.db_cache['tests'], MagicMock())
# THEN a verse array should be returned
self.assertEqual(False, results, "The bible Search should return False")