forked from openlp/openlp
Make Zefania import guess book from number if name is unavailable. Fixes bug 1417033.
Fixes: https://launchpad.net/bugs/1417033
This commit is contained in:
parent
cfa8e4f2df
commit
5b717db63a
@ -58,7 +58,7 @@ class OSISBible(BibleDB):
|
|||||||
# NOTE: We don't need to do any of the normal encoding detection here, because lxml does it's own encoding
|
# NOTE: We don't need to do any of the normal encoding detection here, because lxml does it's own encoding
|
||||||
# detection, and the two mechanisms together interfere with each other.
|
# detection, and the two mechanisms together interfere with each other.
|
||||||
import_file = open(self.filename, 'rb')
|
import_file = open(self.filename, 'rb')
|
||||||
osis_bible_tree = etree.parse(import_file)
|
osis_bible_tree = etree.parse(import_file, parser=etree.XMLParser(recover=True))
|
||||||
namespace = {'ns': 'http://www.bibletechnologies.net/2003/OSIS/namespace'}
|
namespace = {'ns': 'http://www.bibletechnologies.net/2003/OSIS/namespace'}
|
||||||
# Find bible language
|
# Find bible language
|
||||||
language_id = None
|
language_id = None
|
||||||
|
@ -57,7 +57,7 @@ class ZefaniaBible(BibleDB):
|
|||||||
# NOTE: We don't need to do any of the normal encoding detection here, because lxml does it's own encoding
|
# NOTE: We don't need to do any of the normal encoding detection here, because lxml does it's own encoding
|
||||||
# detection, and the two mechanisms together interfere with each other.
|
# detection, and the two mechanisms together interfere with each other.
|
||||||
import_file = open(self.filename, 'rb')
|
import_file = open(self.filename, 'rb')
|
||||||
zefania_bible_tree = etree.parse(import_file)
|
zefania_bible_tree = etree.parse(import_file, parser=etree.XMLParser(recover=True))
|
||||||
# Find bible language
|
# Find bible language
|
||||||
language_id = None
|
language_id = None
|
||||||
language = zefania_bible_tree.xpath("/XMLBIBLE/INFORMATION/language/text()")
|
language = zefania_bible_tree.xpath("/XMLBIBLE/INFORMATION/language/text()")
|
||||||
@ -76,9 +76,19 @@ class ZefaniaBible(BibleDB):
|
|||||||
etree.strip_elements(zefania_bible_tree, ('PROLOG', 'REMARK', 'CAPTION', 'MEDIA'), with_tail=False)
|
etree.strip_elements(zefania_bible_tree, ('PROLOG', 'REMARK', 'CAPTION', 'MEDIA'), with_tail=False)
|
||||||
xmlbible = zefania_bible_tree.getroot()
|
xmlbible = zefania_bible_tree.getroot()
|
||||||
for BIBLEBOOK in xmlbible:
|
for BIBLEBOOK in xmlbible:
|
||||||
book_ref_id = self.get_book_ref_id_by_name(str(BIBLEBOOK.get('bname')), num_books)
|
if self.stop_import_flag:
|
||||||
if not book_ref_id:
|
break
|
||||||
book_ref_id = self.get_book_ref_id_by_localised_name(str(BIBLEBOOK.get('bname')))
|
bname = BIBLEBOOK.get('bname')
|
||||||
|
bnumber = BIBLEBOOK.get('bnumber')
|
||||||
|
if not bname and not bnumber:
|
||||||
|
continue
|
||||||
|
if bname:
|
||||||
|
book_ref_id = self.get_book_ref_id_by_name(bname, num_books)
|
||||||
|
if not book_ref_id:
|
||||||
|
book_ref_id = self.get_book_ref_id_by_localised_name(bname)
|
||||||
|
else:
|
||||||
|
log.debug('Could not find a name, will use number, basically a guess.')
|
||||||
|
book_ref_id = int(bnumber)
|
||||||
if not book_ref_id:
|
if not book_ref_id:
|
||||||
log.error('Importing books from "%s" failed' % self.filename)
|
log.error('Importing books from "%s" failed' % self.filename)
|
||||||
return False
|
return False
|
||||||
@ -94,7 +104,7 @@ class ZefaniaBible(BibleDB):
|
|||||||
self.wizard.increment_progress_bar(
|
self.wizard.increment_progress_bar(
|
||||||
translate('BiblesPlugin.Zefnia', 'Importing %(bookname)s %(chapter)s...' %
|
translate('BiblesPlugin.Zefnia', 'Importing %(bookname)s %(chapter)s...' %
|
||||||
{'bookname': db_book.name, 'chapter': chapter_number}))
|
{'bookname': db_book.name, 'chapter': chapter_number}))
|
||||||
self.session.commit()
|
self.session.commit()
|
||||||
self.application.process_events()
|
self.application.process_events()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
critical_error_message_box(
|
critical_error_message_box(
|
||||||
|
@ -77,7 +77,6 @@ class TestZefaniaImport(TestCase):
|
|||||||
mocked_import_wizard = MagicMock()
|
mocked_import_wizard = MagicMock()
|
||||||
importer = ZefaniaBible(mocked_manager, path='.', name='.', filename='')
|
importer = ZefaniaBible(mocked_manager, path='.', name='.', filename='')
|
||||||
importer.wizard = mocked_import_wizard
|
importer.wizard = mocked_import_wizard
|
||||||
importer.get_book_ref_id_by_name = MagicMock()
|
|
||||||
importer.create_verse = MagicMock()
|
importer.create_verse = MagicMock()
|
||||||
importer.create_book = MagicMock()
|
importer.create_book = MagicMock()
|
||||||
importer.session = MagicMock()
|
importer.session = MagicMock()
|
||||||
@ -92,3 +91,34 @@ class TestZefaniaImport(TestCase):
|
|||||||
self.assertTrue(importer.create_verse.called)
|
self.assertTrue(importer.create_verse.called)
|
||||||
for verse_tag, verse_text in test_data['verses']:
|
for verse_tag, verse_text in test_data['verses']:
|
||||||
importer.create_verse.assert_any_call(importer.create_book().id, '1', verse_tag, verse_text)
|
importer.create_verse.assert_any_call(importer.create_book().id, '1', verse_tag, verse_text)
|
||||||
|
importer.create_book.assert_any_call('Genesis', 1, 1)
|
||||||
|
|
||||||
|
def file_import_no_book_name_test(self):
|
||||||
|
"""
|
||||||
|
Test the import of Zefania Bible file without book names
|
||||||
|
"""
|
||||||
|
# GIVEN: Test files with a mocked out "manager", "import_wizard", and mocked functions
|
||||||
|
# get_book_ref_id_by_name, create_verse, create_book, session and get_language.
|
||||||
|
result_file = open(os.path.join(TEST_PATH, 'rst.json'), 'rb')
|
||||||
|
test_data = json.loads(result_file.read().decode())
|
||||||
|
bible_file = 'zefania-rst.xml'
|
||||||
|
with patch('openlp.plugins.bibles.lib.zefania.ZefaniaBible.application'):
|
||||||
|
mocked_manager = MagicMock()
|
||||||
|
mocked_import_wizard = MagicMock()
|
||||||
|
importer = ZefaniaBible(mocked_manager, path='.', name='.', filename='')
|
||||||
|
importer.wizard = mocked_import_wizard
|
||||||
|
importer.create_verse = MagicMock()
|
||||||
|
importer.create_book = MagicMock()
|
||||||
|
importer.session = MagicMock()
|
||||||
|
importer.get_language = MagicMock()
|
||||||
|
importer.get_language.return_value = 'Russian'
|
||||||
|
|
||||||
|
# WHEN: Importing bible file
|
||||||
|
importer.filename = os.path.join(TEST_PATH, bible_file)
|
||||||
|
importer.do_import()
|
||||||
|
|
||||||
|
# THEN: The create_verse() method should have been called with each verse in the file.
|
||||||
|
self.assertTrue(importer.create_verse.called)
|
||||||
|
for verse_tag, verse_text in test_data['verses']:
|
||||||
|
importer.create_verse.assert_any_call(importer.create_book().id, '1', verse_tag, verse_text)
|
||||||
|
importer.create_book.assert_any_call('Exodus', 2, 1)
|
||||||
|
16
tests/resources/bibles/rst.json
Normal file
16
tests/resources/bibles/rst.json
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"book": "Exodus",
|
||||||
|
"chapter": 1,
|
||||||
|
"verses": [
|
||||||
|
[ "1", "Вот имена сынов Израилевых, которые вошли в Египет с Иаковом, вошли каждый с домом своим:" ],
|
||||||
|
[ "2", "Рувим, Симеон, Левий и Иуда," ],
|
||||||
|
[ "3", "Иссахар, Завулон и Вениамин," ],
|
||||||
|
[ "4", "Дан и Неффалим, Гад и Асир." ],
|
||||||
|
[ "5", "Всех же душ, происшедших от чресл Иакова, было семьдесят, а Иосиф был [уже] в Египте." ],
|
||||||
|
[ "6", "И умер Иосиф и все братья его и весь род их;" ],
|
||||||
|
[ "7", "а сыны Израилевы расплодились и размножились, и возросли и усилились чрезвычайно, и наполнилась ими земля та." ],
|
||||||
|
[ "8", "И восстал в Египте новый царь, который не знал Иосифа," ],
|
||||||
|
[ "9", "и сказал народу своему: вот, народ сынов Израилевых многочислен и сильнее нас;" ],
|
||||||
|
[ "10", "перехитрим же его, чтобы он не размножался; иначе, когда случится война, соединится и он с нашими неприятелями, и вооружится против нас, и выйдет из земли [нашей]." ]
|
||||||
|
]
|
||||||
|
}
|
48
tests/resources/bibles/zefania-rst.xml
Normal file
48
tests/resources/bibles/zefania-rst.xml
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--Visit the online documentation for Zefania XML Markup-->
|
||||||
|
<!--http://bgfdb.de/zefaniaxml/bml/-->
|
||||||
|
<!--Download another Zefania XML files from-->
|
||||||
|
<!--http://sourceforge.net/projects/zefania-sharp-->
|
||||||
|
<XMLBIBLE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="zef2005.xsd" version="2.0.1.18" status="v" biblename="Russian Synodal Translation" type="x-bible" revision="0">
|
||||||
|
<INFORMATION>
|
||||||
|
<title>Russian Synodal Translation</title>
|
||||||
|
<format>Zefania XML Bible Markup Language</format>
|
||||||
|
<date>2009-01-20</date>
|
||||||
|
<creator>Jens Grabner</creator>
|
||||||
|
<source>http://www.agape-biblia.org
|
||||||
|
http://www.crosswire.org/sword/modules/</source>
|
||||||
|
<language>RUS</language>
|
||||||
|
<publisher />
|
||||||
|
<identifier>RST</identifier>
|
||||||
|
<contributors>
|
||||||
|
1876 Russian Synodal Translation, 1956 Edition
|
||||||
|
The text was supplied by "Light in East Germany".</contributors>
|
||||||
|
<rights>
|
||||||
|
</rights>
|
||||||
|
<description>
|
||||||
|
"Light in East Germany" Tel +49 711 83 30 57
|
||||||
|
Postfach 1340 Fax +49 711 83 13 51
|
||||||
|
7015 Korntal
|
||||||
|
Munchingen 1
|
||||||
|
Germany
|
||||||
|
</description>
|
||||||
|
<subject />
|
||||||
|
<type />
|
||||||
|
<coverage />
|
||||||
|
</INFORMATION>
|
||||||
|
<BIBLEBOOK bnumber="2">
|
||||||
|
<CHAPTER cnumber="1">
|
||||||
|
<CAPTION vref="1">Вторая книга Моисеева. Исход</CAPTION>
|
||||||
|
<VERS vnumber="1">Вот имена сынов Израилевых, которые вошли в Египет с Иаковом, вошли каждый с домом своим:</VERS>
|
||||||
|
<VERS vnumber="2">Рувим, Симеон, Левий и Иуда,</VERS>
|
||||||
|
<VERS vnumber="3">Иссахар, Завулон и Вениамин,</VERS>
|
||||||
|
<VERS vnumber="4">Дан и Неффалим, Гад и Асир.</VERS>
|
||||||
|
<VERS vnumber="5">Всех же душ, происшедших от чресл Иакова, было семьдесят, а Иосиф был [уже] в Египте.</VERS>
|
||||||
|
<VERS vnumber="6">И умер Иосиф и все братья его и весь род их;</VERS>
|
||||||
|
<VERS vnumber="7">а сыны Израилевы расплодились и размножились, и возросли и усилились чрезвычайно, и наполнилась ими земля та.</VERS>
|
||||||
|
<VERS vnumber="8">И восстал в Египте новый царь, который не знал Иосифа,</VERS>
|
||||||
|
<VERS vnumber="9">и сказал народу своему: вот, народ сынов Израилевых многочислен и сильнее нас;</VERS>
|
||||||
|
<VERS vnumber="10">перехитрим же его, чтобы он не размножался; иначе, когда случится война, соединится и он с нашими неприятелями, и вооружится против нас, и выйдет из земли [нашей].</VERS>
|
||||||
|
</CHAPTER>
|
||||||
|
</BIBLEBOOK>
|
||||||
|
</XMLBIBLE>
|
Loading…
Reference in New Issue
Block a user